我有執行廣度優先搜索資源的算法:螺紋〜廣度優先處理
def crawl(starting_node)
items=[starting_node]
until items.empty?
item = items.shift
kids = item.slow_network_action # takes seconds
kids.each{ |kid| items << kid }
end
end
我想用幾個併發線程並行化slow_network_action。
什麼是合理的方式來做到這一點?
下面是工作的技術,但我覺得一定是不正確的方法:
def crawl(starting_node)
mutex = Mutex.new
items = [starting_node]
4.times.map{
loop do
unless item=mutex.synchronize{ items.shift }
sleep LONGER_THAN_LONGEST_NETWORK_ACTION
break unless item=mutex.synchronize{ items.shift }
end
kids = item.slow_network_action
mutex.synchronize{
kids.each{ |kid| items << kid }
}
end
}.each(&:join)
end
我想這樣做有螺紋的睡眠時間實際上在等待一個項目被添加到隊列中,在添加項目時喚醒,並且當所有人都在等待時沒有添加任何線程時退出所有線程。
這個交替代碼差不多的作品,但對於可以(並)發生死鎖,總缺乏適當的退出策略:
require 'thread'
def crawl(starting_node)
items = Queue.new
items << starting_node
4.times.map{
while item=items.shift
kids = item.slow_network_action
kids.each{ |kid| items << kid }
end
}.each(&:join)
end
您需要查看監視器和條件變量:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/monitor/rdoc/Monitor.html。我會寫一個更詳細的答案,但我要去睡覺了。 – matt 2012-04-27 02:13:48