婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 初步講解Ruby編程中的多線程

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

熱門標(biāo)簽:柯城手機(jī)地圖如何做地圖標(biāo)注 巫師3地圖標(biāo)注魔力之所 AI電銷機(jī)器人 線路 中牟外呼系統(tǒng)違法嗎 漯河電銷 天津外呼系統(tǒng)怎么收費(fèi) 征服者企業(yè)地圖標(biāo)注 外呼線路從哪里出來(lái)的 淮安自動(dòng)外呼系統(tǒng)供應(yīng)商

每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。

線程是程序中一個(gè)單一的順序控制流程,在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。

Ruby 中我們可以通過(guò) Thread 類來(lái)創(chuàng)建多線程,Ruby的線程是一個(gè)輕量級(jí)的,可以以高效的方式來(lái)實(shí)現(xiàn)并行的代碼。
創(chuàng)建 Ruby 線程

要啟動(dòng)一個(gè)新的線程,只需要調(diào)用 Thread.new 即可:

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

實(shí)例

以下實(shí)例展示了如何在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}"

以上代碼執(zhí)行結(jié)果為:

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、線程的創(chuàng)建可以使用Thread.new,同樣可以以同樣的語(yǔ)法使用Thread.start 或者Thread.fork這三個(gè)方法來(lái)創(chuàng)建線程。

2、創(chuàng)建線程后無(wú)需啟動(dòng),線程會(huì)自動(dòng)執(zhí)行。

3、Thread 類定義了一些方法來(lái)操控線程。線程執(zhí)行Thread.new中的代碼塊。

4、線程代碼塊中最后一個(gè)語(yǔ)句是線程的值,可以通過(guò)線程的方法來(lái)調(diào)用,如果線程執(zhí)行完畢,則返回線程值,否則不返回值直到線程執(zhí)行完畢。

5、Thread.current 方法返回表示當(dāng)前線程的對(duì)象。 Thread.main 方法返回主線程。

6、通過(guò) Thread.Join 方法來(lái)執(zhí)行線程,這個(gè)方法會(huì)掛起主線程,直到當(dāng)前線程執(zhí)行完畢。
線程狀態(tài)

線程有5種狀態(tài):

線程和異常

當(dāng)某線程發(fā)生異常,且沒有被rescue捕捉到時(shí),該線程通常會(huì)被無(wú)警告地終止。但是,若有其它線程因?yàn)門hread#join的關(guān)系一直等待該線程的話,則等待的線程同樣會(huì)被引發(fā)相同的異常。

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

使用下列3個(gè)方法,就可以讓解釋器在某個(gè)線程因異常而終止時(shí)中斷運(yùn)行。

  •     啟動(dòng)腳本時(shí)指定-d選項(xiàng),并以調(diào)試模時(shí)運(yùn)行。
  •     用Thread.abort_on_exception設(shè)置標(biāo)志。
  •     使用Thread#abort_on_exception對(duì)指定的線程設(shè)定標(biāo)志。

當(dāng)使用上述3種方法之一后,整個(gè)解釋器就會(huì)被中斷。

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

線程同步控制

在Ruby中,提供三種實(shí)現(xiàn)同步的方式,分別是:

1. 通過(guò)Mutex類實(shí)現(xiàn)線程同步

2. 監(jiān)管數(shù)據(jù)交接的Queue類實(shí)現(xiàn)線程同步

3. 使用ConditionVariable實(shí)現(xiàn)同步控制
通過(guò)Mutex類實(shí)現(xiàn)線程同步

通過(guò)Mutex類實(shí)現(xiàn)線程同步控制,如果在多個(gè)線程鐘同時(shí)需要一個(gè)程序變量,可以將這個(gè)變量部分使用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

輸出結(jié)果如下:

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同步對(duì)某一個(gè)變量的訪問(wèn)。
監(jiān)管數(shù)據(jù)交接的Queue類實(shí)現(xiàn)線程同步

Queue類就是表示一個(gè)支持線程的隊(duì)列,能夠同步對(duì)隊(duì)列末尾進(jìn)行訪問(wèn)。不同的線程可以使用統(tǒng)一個(gè)對(duì)類,但是不用擔(dān)心這個(gè)隊(duì)列中的數(shù)據(jù)是否能夠同步,另外使用SizedQueue類能夠限制隊(duì)列的長(zhǎng)度

SizedQueue類能夠非常便捷的幫助我們開發(fā)線程同步的應(yīng)用程序,應(yīng)為只要加入到這個(gè)隊(duì)列中,就不用關(guān)心線程的同步問(wèn)題。

經(jīng)典的生產(chǎn)者消費(fèi)者問(wèn)題:

#encoding:gbk
require "thread"
puts "SizedQuee Test"
 
queue = Queue.new
 
producer = Thread.new do
  10.times do |i|
    sleep rand(i) # 讓線程睡眠一段時(shí)間
    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實(shí)現(xiàn)同步控制

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

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

mutex 是聲明的一個(gè)資源,然后通過(guò)ConditionVariable來(lái)控制申請(qǐng)和釋放這個(gè)資源。

b 線程完成了某些工作之后釋放資源resource.signal,這樣a線程就可以獲得一個(gè)mutex資源然后進(jìn)行執(zhí)行。 執(zhí)行結(jié)果:

thread synchronize by ConditionVariable
get resource
complete

線程類方法

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


線程實(shí)例化方法

以下實(shí)例調(diào)用了線程實(shí)例化方法 join:

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

以下是完整實(shí)例化方法列表:

線程實(shí)例化方法

以下實(shí)例調(diào)用了線程實(shí)例化方法 join:

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

以下是完整實(shí)例化方法列表:


您可能感興趣的文章:
  • 使用Ruby來(lái)處理JSON的簡(jiǎn)單教程
  • 使用Ruby編寫發(fā)送郵件的程序的簡(jiǎn)單教程
  • 在Ruby中利用Net::SMTP類發(fā)送電子郵件的教程

標(biāo)簽:甘孜 內(nèi)江 克拉瑪依 大慶 南昌 棗莊 河池 西雙版納

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《初步講解Ruby編程中的多線程》,本文關(guān)鍵詞  初步,講解,Ruby,編程,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《初步講解Ruby編程中的多線程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于初步講解Ruby編程中的多線程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 新兴县| 宣威市| 凯里市| 巴马| 石首市| 刚察县| 温州市| 海口市| 怀仁县| 建始县| 合肥市| 阿坝| 天台县| 阿克陶县| 凤庆县| 平乡县| 丽江市| 平和县| 阜城县| 乃东县| 林西县| 平远县| 阳东县| 湘阴县| 南城县| 奉化市| 左权县| 资溪县| 河北区| 十堰市| 玛纳斯县| 崇仁县| 枣阳市| 榆中县| 洛川县| 赤峰市| 通许县| 赤峰市| 永平县| 从江县| 宿州市|