Ruby多線程編程
線程表示輕量級的子進程。 它是一個單獨的執行路徑。 在Ruby中,程序的不同部分可以通過使用多個進程在不同程序之間使用多個線程執行,或拆分程序中的任務來同時運行。
Ruby中的線程是併發編程模型的實現。
Ruby多線程
一般情況下,一個正常的程序的執行路徑是單線執行。 按編碼的順序執行程序中的所有語句。
但是在多線程程序中,可以按多個路徑多個執行程序。 多線程使用較少的內存空間並共享相同的地址空間。 多線程用於一次執行多個任務。
使用thread.new
調用創建一個新線程。它與主線程的執行不同。
線程初始化
要創建一個新的線程Ruby提供了三個關鍵字,即::new
,::start
和::fork
。
要啓動新線程,請將一個代碼塊調用Thread.new
,Thread.start
或Thread.fork
相關聯。這樣線程將被創建,新的線程在塊退出時退出。
語法:
# Original thread runs
Thread.new {
# New thread is created.
}
# Original thread runs
線程終止
在Ruby中終止一個線程有不同的方法。 要退出給定的線程,使用類名 ::kill
方法。
語法:
thr = Thread.new { ... }
Thread.kill(thr)
Ruby線程實例
#!/usr/bin/ruby
# file : thread-example.rb
th = Thread.new do #Here we start a new thread
Thread.current['counter']=0
5.times do |i| #loop starts and increases i each time
Thread.current['counter']=i
sleep 1
end
return nil
end
while th['counter'].to_i < 4 do
=begin
th is the long running thread
and we can access the same variable
from inside the thread here
=end
puts "Counter is #{th['counter']}"
sleep 0.5
end
puts "Long running process finished!"
執行上面代碼,輸出以下結果 -
F:\worksp\ruby>ruby thread-example.rb
Counter is
Counter is 0
Counter is 1
Counter is 1
Counter is 2
Counter is 2
Counter is 3
Counter is 3
Long running process finished!
F:\worksp\ruby>
線程生命週期
線程創建完成後,無需啓動線程。 它獲得正確的CPU資源後自動運行。 塊中的最後一個表達式是線程的值。 如果線程完全運行,則value
方法返回線程值,否則,value
方法阻塞,並在線程完成時返回。 線程類在運行查詢和操作線程時定義了一些方法。
通過調用線程的Thread.join
方法,可以等待一個特定的線程完成。
線程異常處理
線程可能也會有一些異常。異常發生在主線程以外的任何線程中,但這取決於abort_on_exception
。 默認情況下,此選項始終爲false
。表示未處理的異常將靜默地終止線程。 這可以通過將abort_on_exception = true
或$DEBUG
設置爲true
來更改。
要處理異常,可以使用類的::handle_interrupt
方法。 它將使用線程異步處理異常。
線程變量和範圍
在塊上創建線程。 在塊內創建的局部變量僅可在該塊存在的線程中訪問。
Ruby線程類允許通過名稱創建和訪問線程局部變量。 線程對象像哈希一樣處理,使用[]=
寫入元素,並使用[]
讀取它們。
線程調度
Ruby支持通過在程序中使用::stop
和::pass
方法調度線程。
類的::stop
方法將當前正在運行的線程置於休眠狀態並調度另一個線程的執行。 一旦線程處於休眠狀態,實例方法喚醒被用來標記線程符合調度條件。
類的::pass
方法嘗試將執行傳遞給另一個線程。 這取決於操作系統運行的線程是否切換。
線程優先級提供了根據優先級調度線程的操作。 高優先級線程首先安排執行。 它也取決於操作系統。 線程可以隨着第一個動作增加或減少自己的優先級。
線程排除
Ruby線程排除的狀態,當兩個線程共享相同的數據並且其中一個線程修改該數據時,需要確保在沒有線程操作數據處於不一致的狀態。 例如,銀行服務器。 一個線程在賬戶中進行匯款,其他線程正在爲客戶生成月度報表。
公共類方法
方法
描述
abort_on_exception
它返回全局「異常中止」狀態,默認值爲true
。 當它設置爲true
時,如果在任何線程中引發異常時,則所有線程將中止。
abort_on_exception=
當設置爲true
時,如果引發異常,所有線程將中止。 它返回新的狀態。
current
它返回當前執行的線程。
exclusive{block}
它將塊封裝在一個單獨的塊中,返回塊的值。
exit
它終止當前運行的線程並計劃另一個線程運行。
kill(thread)
它使指定的線程退出。
fork([args]*){args / block}
它與::new
方法基本相同。
handle_interrupt(hash){…}
更改異步中斷時序。
list
返回可運行或停止的所有線程的線程對象數組。
main
返回主線程
new{...}/ new(*args, &proc)/ new(*args){/args/...}
它創建一個執行給定塊的新線程。
pass
它給線程調度程序一個提示,以將執行傳遞給另一個線程。 運行的線程可能會或可能不會根據操作系統進行切換。
pending_interrupt?(error = nil)
它返回異步隊列是否爲空?
start([args]*){/args/block}
它與::new
方法基本相同。
stop
它停止執行當前線程,將其置於「睡眠」狀態,並計劃執行另一個線程。
公共實例方法
方法
描述
thr[sym]
它使用字符串或符號名稱返回局部變量的值。
thr[sym]=
它使用字符串或符號名稱創建局部變量的值。
abort_on_exception
它返回第三個「異常中止」的狀態。
abort_on_exception=
當設置爲true
時,如果在此thr
中引發異常,所有線程將中止。
add_trace_func(proc)
添加proc
作爲跟蹤的處理程序。
alive?
如果此thr
運行或睡眠,則返回true。
backtrace
它返回目標的追溯目標。
backtrace_locations(*args)
它返回前面的目標的執行堆棧。
exit/kill/terminate
它終止thr
並執行另一個線程運行。
group
它返回包含給定線程的ThreadGroup
,或返回nil
。
inspect
它將返回thr
的字符串名稱,id和狀態。
join
調用線程將暫停執行並運行此thr
。
key?(sym)
如果給定的字符串作爲thr
局部變量存在,則返回true
。
keys
它返回一個thr
局部變量名稱的數組。
pending_interrupt?(error=nil)
判斷返回目標線程的異步隊列是否爲空。
priority
它返回thr
的優先級。
priority=
它將thr
的優先級設置爲一個整數。
kill
它與exit
方法一樣。
raise
它引發了給定線程的異常。
run
它喚醒了thr
,使其可調度。
safe_level
它返回安全級別。
set_trace_func(proc)
它作爲處理程序在thr
上建立proc。
status
它返回thr
的狀態。
stop?
如果thr
休眠或終止,則返回true
。
terminate
它終止thr
並計劃另一個線程運行。
thread_variable?(key)
如果給定的字符串作爲線程局部變量存在,則返回true
。
thread_variable_get(key)
它返回已設置的線程局部變量的值。
thread_variable_set(key, value)
設置一個線程的局部鍵和值。
thread_variable
它返回線程局部變量的數組。
value
它等待thr
完成,使用join
並返回其值。
wakeup
使給定線程有資格進行調度,儘管它仍然可能在I/O上阻塞。