執行緒表示輕量級的子進程。 它是一個單獨的執行路徑。 在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)
#!/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上阻塞。 |