2013-07-25 55 views
0

是否有可能創建一個「工作線程」,可以說它處於待機狀態,直到它接收到一個異步執行的函數?如何讓紅寶石線程執行我選擇的功能?

有沒有辦法送樣

def some_function 
puts "hi" 
# write something 
db.exec() 
end 

到一個現有的線程只是坐在那裏等待功能?

這個想法是我想將一些數據庫寫入到異步運行的線程中。

我想過創建Queue實例,然後有一個線程做這樣的事情:

$command = Queue.new 
Thread.new do 
while trigger = $command.pop 
    some_method 
end 
end 

$command.push("go!") 

然而,這似乎不是一個特別好的辦法去了解它。什麼是更好的選擇?

回答

0

thread gem看起來它會滿足您的需求:

require 'thread/channel' 

def some_method 
    puts "hi" 
end 

channel = Thread.channel 

Thread.new do 
    while data = channel.receive 
    some_method 
    end 
end 

channel.send("go!") 
channel.send("ruby!") # Any truthy message will do 
channel.send(nil)  # Non-truthy message to terminate other thread 

sleep(1)    # Give other thread time to do I/O 

通道使用ConditionVariable,而如果你願意,你可以用你自己。