好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 初步講解Ruby編程中的多線程

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

熱門標簽:柯城手機地圖如何做地圖標注 巫師3地圖標注魔力之所 AI電銷機器人 線路 中牟外呼系統違法嗎 漯河電銷 天津外呼系統怎么收費 征服者企業地圖標注 外呼線路從哪里出來的 淮安自動外呼系統供應商

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

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

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
  end
end
 
def func2
  j=0
  while j=2
   puts "func2 at: #{Time.now}"
   sleep(1)
   j=j+1
  end
end
 
puts "Started At #{Time.now}"
t1=Thread.new{func1()}
t2=Thread.new{func2()}
t1.join
t2.join
puts "End at #{Time.now}"

以上代碼執行結果為:

Started At Wed May 14 08:21:54 -0700 2014
func1 at: Wed May 14 08:21:54 -0700 2014
func2 at: Wed May 14 08:21:54 -0700 2014
func2 at: Wed May 14 08:21:55 -0700 2014
func1 at: Wed May 14 08:21:56 -0700 2014
func2 at: Wed May 14 08:21:56 -0700 2014
func1 at: Wed May 14 08:21:58 -0700 2014
End 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種狀態:

線程和異常

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

begin
 t = Thread.new do
  Thread.pass  # 主線程確實在等join
  raise "unhandled exception"
 end
 t.join
rescue
 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:gbk
require "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.unlock
end
 
ticket1=Thread.new 10 do
  10.times do |value|
  ticketNum=15
  buyTicket(ticketNum)
  sleep 0.01
  end
end
 
ticket2=Thread.new 10 do
  10.times do |value|
  ticketNum=20
  buyTicket(ticketNum)
  sleep 0.01
  end
end
 
sleep 1
ticket1.join
ticket2.join

輸出結果如下:

Synchronize Thread
you have successfully bought 15 tickets
you have successfully bought 20 tickets
you have successfully bought 15 tickets
you have successfully bought 20 tickets
you have successfully bought 15 tickets
you have successfully bought 20 tickets
you have successfully bought 15 tickets
you have successfully bought 20 tickets
you have successfully bought 15 tickets
you have successfully bought 20 tickets
you have successfully bought 15 tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets
sorry,no enough tickets

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

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

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

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

#encoding:gbk
require "thread"
puts "SizedQuee Test"
 
queue = Queue.new
 
producer = Thread.new do
  10.times do |i|
    sleep rand(i) # 讓線程睡眠一段時間
    queue  i
    puts "#{i} produced"
  end
end
 
consumer = Thread.new do
  10.times do |i|
    value = queue.pop
    sleep rand(i/2)
    puts "consumed #{value}"
  end
end
 
consumer.join

程序的輸出:
SizedQuee Test
0 produced
1 produced
consumed 0
2 produced
consumed 1
consumed 2
3 produced
consumed 34 produced
 
consumed 4
5 produced
consumed 5
6 produced
consumed 6
7 produced
consumed 7
8 produced
9 produced
consumed 8
consumed 9

使用ConditionVariable實現同步控制

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

#encoding:gbk
require "thread"
puts "thread synchronize by ConditionVariable"
 
mutex = Mutex.new
resource = 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.join
puts "complete"

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

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

thread synchronize by ConditionVariable
get resource
complete

線程類方法

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


線程實例化方法

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

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

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

線程實例化方法

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

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

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


您可能感興趣的文章:
  • 使用Ruby來處理JSON的簡單教程
  • 使用Ruby編寫發送郵件的程序的簡單教程
  • 在Ruby中利用Net::SMTP類發送電子郵件的教程

標簽:甘孜 內江 克拉瑪依 大慶 南昌 棗莊 河池 西雙版納

巨人網絡通訊聲明:本文標題《初步講解Ruby編程中的多線程》,本文關鍵詞  初步,講解,Ruby,編程,中的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《初步講解Ruby編程中的多線程》相關的同類信息!
  • 本頁收集關于初步講解Ruby編程中的多線程的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 娜美被?到爽??高潮痉挛漫画| 欧美电影成人h版在线| 免费无码又爽又黄又刺激网站简爱| 十八女人国产毛毛片第五集| 美女露出胸无遮| www色综合| 英语老师解开裙子让我添 | 老司机精品视频在线播放| 欧美超清videos1080hd| 波多野结衣电影全集| 999久久久国产精品消防器材软件| 黄网站污| 虐玩贱奴肉体调教男男| 人人干人人做| 91欧美一区二区三区成人| 久久精品中文字幕一区| 青青青国产精品国产精品久久久久| 美女脱得一二净无内衣内裤| 60488yy午夜A片私人影院| 午夜成人亚洲理论片在线观看简爱| 亚洲国产精品日韩一线满| 六月丁香久久丫| 亚洲字字幕在线中文乱码全集资源 | 装醉看娇妻被两个朋友玩| 国产真实伦对白精彩脏话| 亚洲视频毛片| 红尘都市梦龙周梦龙| 色戒蘑菇影视| 久久久久精品白浆无码是什么意思 | 男女啪啪猛烈无遮挡猛进猛出| 成年女人天堂香蕉网视频| 欧美成人h版电影在线观看| 视频国产精品| 日韩欧美久久一区二区| 99re思思| 成人免费观看A片www动漫| 69日本人xxxxxxxx色| 一级毛片在线直接观看| 深夜动态福利gif进出粗暴| vagaa亚洲亚洲色爽影院91| 法国性猛交HD3|