私は、リソースの幅優先探索を実行するアルゴリズムがあります。スレッド〜幅優先処理
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