亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

初步講解Ruby編程中的多線程

2020-10-29 19:41:37
字體:
來源:轉載
供稿:網友

每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。

線程是程序中一個單一的順序控制流程,在單個程序中同時運行多個線程完成不同的工作,稱為多線程。

Ruby 中我們可以通過 Thread 類來創建多線程,Ruby的線程是一個輕量級的,可以以高效的方式來實現并行的代碼。
創建 Ruby 線程

要啟動一個新的線程,只需要調用 Thread.new 即可:

# 線程 #1 代碼部分Thread.new { # 線程 #2 執行代碼}# 線程 #1 執行代碼

實例

以下實例展示了如何在Ruby程序中使用多線程:

#!/usr/bin/ruby def func1  i=0  while i<=2   puts "func1 at: #{Time.now}"   sleep(2)   i=i+1  endend def func2  j=0  while j<=2   puts "func2 at: #{Time.now}"   sleep(1)   j=j+1  endend puts "Started At #{Time.now}"t1=Thread.new{func1()}t2=Thread.new{func2()}t1.joint2.joinputs "End at #{Time.now}"

以上代碼執行結果為:

Started At Wed May 14 08:21:54 -0700 2014func1 at: Wed May 14 08:21:54 -0700 2014func2 at: Wed May 14 08:21:54 -0700 2014func2 at: Wed May 14 08:21:55 -0700 2014func1 at: Wed May 14 08:21:56 -0700 2014func2 at: Wed May 14 08:21:56 -0700 2014func1 at: Wed May 14 08:21:58 -0700 2014End at Wed May 14 08:22:00 -0700 2014

線程生命周期

1、線程的創建可以使用Thread.new,同樣可以以同樣的語法使用Thread.start 或者Thread.fork這三個方法來創建線程。

2、創建線程后無需啟動,線程會自動執行。

3、Thread 類定義了一些方法來操控線程。線程執行Thread.new中的代碼塊。

4、線程代碼塊中最后一個語句是線程的值,可以通過線程的方法來調用,如果線程執行完畢,則返回線程值,否則不返回值直到線程執行完畢。

5、Thread.current 方法返回表示當前線程的對象。 Thread.main 方法返回主線程。

6、通過 Thread.Join 方法來執行線程,這個方法會掛起主線程,直到當前線程執行完畢。
線程狀態

線程有5種狀態:

2015410100905173.jpg (800×258)

線程和異常

當某線程發生異常,且沒有被rescue捕捉到時,該線程通常會被無警告地終止。但是,若有其它線程因為Thread#join的關系一直等待該線程的話,則等待的線程同樣會被引發相同的異常。

begin t = Thread.new do  Thread.pass  # 主線程確實在等join  raise "unhandled exception" end t.joinrescue p $! # => "unhandled exception"end

使用下列3個方法,就可以讓解釋器在某個線程因異常而終止時中斷運行。

  •     啟動腳本時指定-d選項,并以調試模時運行。
  •     用Thread.abort_on_exception設置標志。
  •     使用Thread#abort_on_exception對指定的線程設定標志。

當使用上述3種方法之一后,整個解釋器就會被中斷。

t = Thread.new { ... }t.abort_on_exception = true

線程同步控制

在Ruby中,提供三種實現同步的方式,分別是:

1. 通過Mutex類實現線程同步

2. 監管數據交接的Queue類實現線程同步

3. 使用ConditionVariable實現同步控制
通過Mutex類實現線程同步

通過Mutex類實現線程同步控制,如果在多個線程鐘同時需要一個程序變量,可以將這個變量部分使用lock鎖定。 代碼如下:

#encoding:gbkrequire "thread"puts "Synchronize Thread" @num=200@mutex=Mutex.new def buyTicket(num)  @mutex.lock    if @num>=num      @num=@num-num      puts "you have successfully bought #{num} tickets"    else      puts "sorry,no enough tickets"    end  @mutex.unlockend ticket1=Thread.new 10 do  10.times do |value|  ticketNum=15  buyTicket(ticketNum)  sleep 0.01  endend ticket2=Thread.new 10 do  10.times do |value|  ticketNum=20  buyTicket(ticketNum)  sleep 0.01  endend sleep 1ticket1.jointicket2.join

輸出結果如下:

Synchronize Threadyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketsyou have successfully bought 20 ticketsyou have successfully bought 15 ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough ticketssorry,no enough tickets

除了使用lock鎖定變量,還可以使用try_lock鎖定變量,還可以使用Mutex.synchronize同步對某一個變量的訪問。
監管數據交接的Queue類實現線程同步

Queue類就是表示一個支持線程的隊列,能夠同步對隊列末尾進行訪問。不同的線程可以使用統一個對類,但是不用擔心這個隊列中的數據是否能夠同步,另外使用SizedQueue類能夠限制隊列的長度

SizedQueue類能夠非常便捷的幫助我們開發線程同步的應用程序,應為只要加入到這個隊列中,就不用關心線程的同步問題。

經典的生產者消費者問題:

#encoding:gbkrequire "thread"puts "SizedQuee Test" queue = Queue.new producer = Thread.new do  10.times do |i|    sleep rand(i) # 讓線程睡眠一段時間    queue << i    puts "#{i} produced"  endend consumer = Thread.new do  10.times do |i|    value = queue.pop    sleep rand(i/2)    puts "consumed #{value}"  endend consumer.join程序的輸出:SizedQuee Test0 produced1 producedconsumed 02 producedconsumed 1consumed 23 producedconsumed 34 produced consumed 45 producedconsumed 56 producedconsumed 67 producedconsumed 78 produced9 producedconsumed 8consumed 9

使用ConditionVariable實現同步控制

使用 ConditonVariable進行同步控制,能夠在一些致命的資源競爭部分掛起線程直到有可用的資源為止。

#encoding:gbkrequire "thread"puts "thread synchronize by ConditionVariable" mutex = Mutex.newresource = ConditionVariable.new a = Thread.new {  mutex.synchronize {    # 這個線程目前需要resource這個資源    resource.wait(mutex)    puts "get resource"  }} b = Thread.new {  mutex.synchronize {    #線程b完成對resourece資源的使用并釋放resource    resource.signal  }} a.joinputs "complete"

mutex 是聲明的一個資源,然后通過ConditionVariable來控制申請和釋放這個資源。

b 線程完成了某些工作之后釋放資源resource.signal,這樣a線程就可以獲得一個mutex資源然后進行執行。 執行結果:

thread synchronize by ConditionVariableget resourcecomplete

線程類方法

完整的 Thread(線程) 類方法如下:


線程實例化方法

以下實例調用了線程實例化方法 join:

#!/usr/bin/ruby thr = Thread.new do  # 實例化  puts "In second thread"  raise "Raise exception"endthr.join  # 調用實例化方法 join

以下是完整實例化方法列表:

2015410101902229.jpg (927×742)

2015410101949440.jpg (937×179)線程實例化方法

以下實例調用了線程實例化方法 join:

#!/usr/bin/ruby thr = Thread.new do  # 實例化  puts "In second thread"  raise "Raise exception"endthr.join  # 調用實例化方法 join

以下是完整實例化方法列表:

2015410102030312.jpg (936×726)

2015410102049794.jpg (936×451)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情va永久在线播放| 精品高清一区二区三区| 97久久精品人人澡人人爽缅北| 日本19禁啪啪免费观看www| 欧美成年人视频| 98精品在线视频| 久久久久亚洲精品国产| 国外成人在线直播| 国产精品入口福利| 日韩亚洲成人av在线| 久久五月天色综合| 亚洲国产欧美久久| 日韩av男人的天堂| 久久69精品久久久久久国产越南| 欧美一区视频在线| 中文字幕日韩av电影| 欧美成人精品一区二区三区| 97在线视频一区| 69av成年福利视频| 九九精品在线视频| 亚洲欧美日韩精品久久亚洲区| 丰满岳妇乱一区二区三区| 欧美日韩色婷婷| 色噜噜国产精品视频一区二区| 国产精品扒开腿做| 久久精品亚洲精品| 欧美日韩精品中文字幕| 亚洲日韩欧美视频一区| 欧美性xxxxxxxxx| 91精品国产沙发| 国产成人精品久久二区二区91| 亚洲丝袜一区在线| 91探花福利精品国产自产在线| 国产一区二区三区久久精品| 欧美电影免费在线观看| 日韩av高清不卡| 日韩av在线一区| 亚洲乱码国产乱码精品精| 国产精品视频xxxx| 国产成人激情小视频| 亚洲视频国产视频| 国产精品久久久久久中文字| 国产91精品网站| 日韩中文字幕在线| 亚洲欧美精品suv| 日韩av片电影专区| 一个色综合导航| 日韩欧美精品网址| 亚洲国产欧美在线成人app| 欧美电影免费观看网站| 久久这里只有精品视频首页| 亚洲免费av电影| 欧美精品18videosex性欧美| 国产欧美日韩中文字幕| 伊人亚洲福利一区二区三区| 国产精品国内视频| 国产精品高潮呻吟久久av黑人| 欧美黄色片视频| 国产性色av一区二区| 美女少妇精品视频| 奇米4444一区二区三区| 欧美限制级电影在线观看| 欧美高跟鞋交xxxxhd| 亚洲男人天堂2023| 免费97视频在线精品国自产拍| 欧美日韩免费观看中文| 欧美激情中文字幕在线| 国产一区二区免费| 久久九九精品99国产精品| 精品国产一区二区在线| 欧美最顶级丰满的aⅴ艳星| 国产成人在线一区二区| 中文字幕亚洲欧美日韩2019| 国产亚洲欧洲高清| 一区二区在线视频| 91精品免费视频| 亚洲精品日韩丝袜精品| 久久久久久久久久亚洲| 久久久久久成人| 欧美激情免费看| 亚洲一区二区三区777| 日韩成人网免费视频| 亚洲视频一区二区三区| 欧美日韩国产精品一区二区不卡中文| 亚洲免费视频一区二区| 国产亚洲a∨片在线观看| 97视频在线免费观看| 国模叶桐国产精品一区| 欧美日韩国产专区| 精品欧美国产一区二区三区| 91精品视频免费看| 精品久久久久久国产91| 欧美日韩中文字幕日韩欧美| 91免费国产视频| 国产精品免费久久久| 久久久久久噜噜噜久久久精品| 国产精品吹潮在线观看| 国产精品日韩在线观看| 神马久久桃色视频| 91啪国产在线| 日韩成人激情视频| 国产精品xxxxx| 欧美精品久久久久久久| 影音先锋日韩有码| 国产精品美女在线| 亚洲天堂第二页| 亚洲精品欧美一区二区三区| 亚洲精品国产精品久久清纯直播| 国产综合色香蕉精品| 国产精品视频自拍| 久久久在线视频| 欧美极品少妇xxxxⅹ喷水| 欧美亚洲一区在线| 亚洲国模精品私拍| 91九色国产视频| 日韩在线视频观看| 国产精品igao视频| 久久天天躁狠狠躁夜夜躁2014| 欧美国产第一页| 欧美成人性色生活仑片| 亚洲综合成人婷婷小说| 国产va免费精品高清在线| 成人激情电影一区二区| 欧美国产精品人人做人人爱| 久久精品中文字幕免费mv| 国产精品国产亚洲伊人久久| 亚洲国产精品va在线观看黑人| 亚洲深夜福利视频| 国产日韩中文字幕| 欧美高清性猛交| 国产日韩在线看片| 日韩国产欧美精品一区二区三区| 欧美肥老太性生活视频| 九九精品在线观看| 日本三级韩国三级久久| www.色综合| 国产不卡一区二区在线播放| 国产精品人成电影在线观看| 欧美精品videofree1080p| 日本道色综合久久影院| 久久久成人的性感天堂| 欧美综合在线观看| 亚洲性无码av在线| 一本色道久久88综合日韩精品| 亚洲高清免费观看高清完整版| 一本一本久久a久久精品牛牛影视| 国产精品视频最多的网站| 国产午夜精品全部视频在线播放| 亚洲欧美制服综合另类| 亚洲人成在线观看网站高清| 欧美日韩亚洲天堂| 亚洲电影免费在线观看| 亚洲国内高清视频| 欧美裸体视频网站| 97视频在线观看免费高清完整版在线观看| 一区二区成人av| 中文字幕日韩欧美在线视频| **欧美日韩vr在线| 亚洲国产欧美一区二区丝袜黑人| 久久99久久亚洲国产| 中文字幕免费精品一区高清| 欧美性少妇18aaaa视频| 日韩欧美aaa| 在线视频日本亚洲性|