2017-10-19 67 views
0

運行此你如何保持一顆紅寶石線程活着

# in initialize 
@queue = Queue.new 

@threads = Array.new(NUM_THREADS) do 
    Thread.new do 
     until @queue.empty? 
     puts @queue.shift 
     end 
    end 
    end 

# later in another method, calling 
@threads.each { |t| puts t.alive? } # puts false 
@queue.push('something else') 
# new item is not processed by thread 

如何保持一個Ruby線程活着,因此能保持接受來自隊列的東西?

回答

0

問題是你在向隊列添加任何內容之前初始化線程。線程在@queue.push行運行之前開始並死亡。

如果你想永葆線程即使沒有在隊列中,您可以更改線程的邏輯,所以持續循環:

Thread.new do 
    loop do 
    if val = @queue.shift 
     puts val 
    end 
    end 
end 

你可以通過把一個減少CPU消耗sleep在線程循環內部調用,比方說它每次迭代休眠0.1秒,因此它可以每秒處理最多10個項目。例如運行在我的Ruby REPL提高從約0進程的CPU消耗到25%以下的(這是不希望的高)

100.times { Thread.new { loop { } } } 

但下面以小於1%:

100.times { Thread.new { loop { sleep 0.1 } } } 

除了在其中放置任意sleep號碼之外,還有其他方法可以管理後臺進程的CPU消耗:例如eventmachineresquesidekiq