我有一个执行广度优先搜索资源的算法:
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