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

首頁 > 編程 > Ruby > 正文

講解Ruby編程中的多線程

2020-02-24 15:38:34
字體:
來源:轉載
供稿:網友

在Ruby中,我們可以通過線程類創建多線程,Ruby的線程很輕,可以有效地實現并行代碼,多線程在一個程序中同時運行以完成不同的任務稱為多線程,本文是武林技術頻道小編和大家分享的講解Ruby編程中的多線程。
創建 Ruby 線程

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

ruby;"># 線程 #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)

通過以上的介紹,相信大家已經明了講解Ruby編程中的多線程,不過在實際操作的時候,程序員一定要謹慎,選擇武林技術頻道網進行學習,會讓您受益匪淺哦!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍高清视频网站| 国产欧美欧洲在线观看| 国内精品免费午夜毛片| 亚洲综合国产精品| 欧美在线视频观看免费网站| 狠狠躁夜夜躁人人躁婷婷91| 日韩视频精品在线| www.欧美三级电影.com| 国产精品入口日韩视频大尺度| 久久综合久久88| 亚洲欧洲午夜一线一品| 2019中文字幕全在线观看| 国产一区二区三区四区福利| 91欧美精品午夜性色福利在线| 日韩在线观看网站| 中文字幕国产精品久久| 亚洲第一男人天堂| 另类天堂视频在线观看| 成人中心免费视频| 国产精品一区二区性色av| 国产欧美精品一区二区三区介绍| 亚洲欧美另类自拍| 精品成人国产在线观看男人呻吟| 91精品视频在线| 91精品国产综合久久久久久久久| 国产精品国产三级国产aⅴ浪潮| 国产成人精品在线播放| 久久久久国产视频| 黑人巨大精品欧美一区二区三区| 亚洲第一精品夜夜躁人人爽| 久久香蕉频线观| 欧美成aaa人片在线观看蜜臀| 国产精品丝袜久久久久久高清| 在线观看中文字幕亚洲| 日韩高清免费观看| 久久视频这里只有精品| 色婷婷av一区二区三区在线观看| 91精品国产自产在线老师啪| 国产成人亚洲综合91| 国产精品自拍偷拍| 97免费视频在线| 不用播放器成人网| 日韩在线资源网| 久久精品国产综合| 日韩高清中文字幕| 亚洲天堂网站在线观看视频| 欧美成人中文字幕在线| 美女性感视频久久久| 亚洲精品天天看| 少妇精69xxtheporn| 欧美剧在线观看| 日韩va亚洲va欧洲va国产| 亚洲第一天堂无码专区| 亚洲男人天堂2023| 国产精品久久久久久久久免费| 国产日韩欧美另类| 日韩电影中文字幕一区| 亚洲人成在线电影| 亚洲人成在线观看| 亚洲天堂男人天堂| 国产精品久久久91| 久久av中文字幕| 日韩亚洲欧美成人| 日韩中文字幕第一页| 亚洲网站在线播放| 欧美老女人性视频| 欧美wwwwww| 国产精品视频中文字幕91| 国产视频精品va久久久久久| 日韩精品免费一线在线观看| 亚洲欧美日韩精品久久奇米色影视| 亚洲一区二区少妇| 日本高清视频精品| 国产精品欧美亚洲777777| 国产日本欧美视频| 亚洲丁香婷深爱综合| 欧美激情按摩在线| 国产精品激情av电影在线观看| 国产精品国产三级国产专播精品人| 日韩av中文字幕在线| 中国人与牲禽动交精品| 亚洲精品v天堂中文字幕| 国产精品久久一| 韩国v欧美v日本v亚洲| 国产精品久久在线观看| 欧美日韩在线免费| 日韩中文字幕av| 欧美韩日一区二区| 色综合色综合久久综合频道88| 亚洲白拍色综合图区| 国产97在线播放| 欧美精品性视频| 97在线视频免费看| 欧美黄色成人网| 97国产成人精品视频| 久久久久久久久久国产精品| 日本精品久久中文字幕佐佐木| 91久久精品国产| 国产精品久久久久久久7电影| 最新中文字幕亚洲| 亚洲第一综合天堂另类专| 成人av色在线观看| 亚洲国产精品va在看黑人| 欧美高清视频在线播放| 日韩成人在线观看| **欧美日韩vr在线| 亚洲影院在线看| 北条麻妃在线一区二区| 在线成人一区二区| 在线观看欧美www| 日韩电影中文字幕在线| 91成人国产在线观看| 国产精品夫妻激情| 欧美性在线视频| 亚洲激情小视频| 亚洲一区二区精品| 亚洲综合中文字幕在线| 欧美尤物巨大精品爽| 国产精品人人做人人爽| 亚洲综合中文字幕68页| 亚洲欧美日韩久久久久久| 国产成人精品在线播放| 色综合久久天天综线观看| 亚洲国产成人精品久久久国产成人一区| 亚洲精品综合久久中文字幕| 国产日韩欧美在线播放| 成人性生交xxxxx网站| 日本久久久久亚洲中字幕| 欧美综合在线观看| 91精品在线一区| 国产精品尤物福利片在线观看| 欧美第一淫aaasss性| 欧洲美女7788成人免费视频| 午夜精品一区二区三区在线播放| 欧美激情视频网站| 韩国精品美女www爽爽爽视频| 美女性感视频久久久| 亚洲第一中文字幕在线观看| 91精品国产91久久久久久久久| 91久久精品视频| 国产精品视频xxx| www.日本久久久久com.| 日本精品视频在线播放| 亚洲欧洲高清在线| 亚洲第一男人av| 久久精品这里热有精品| 国产成人精品视频| 欧美在线精品免播放器视频| 亚洲第一精品福利| 欧美高清一级大片| 2018国产精品视频| 热re91久久精品国99热蜜臀| 国产精品盗摄久久久| 欧美xxxx做受欧美.88| 综合久久五月天| 黑人极品videos精品欧美裸| 亚洲自拍偷拍一区| 亚洲国产天堂网精品网站| 自拍偷拍亚洲区| 亚洲国产成人爱av在线播放| 亚洲人成网站在线播| 久久精品99久久久香蕉| 亚洲aa在线观看| 国产精品国产福利国产秒拍|