ruby アプリケーションには、状態を共有しないタスクがたくさんあり、一度に多くのタスクを起動したいと考えています。重要なのは、それらが開始された順序や戻り値を気にしないことです (完了する前にそれぞれデータベース トランザクションが発生するため)。Ruby の実装によっては、GIL によってこれらのタスクが実際に同時に実行されない可能性があることは承知していますが、実際には真の同時実行性には関心がないため、問題ありません。とにかく、これらのワーカー スレッドは、ネットワーク リクエストを介して IO バインドされます。
私がこれまでに持っているのはこれです:
def asyncDispatcher(numConcurrent, stateQueue, &workerBlock)
workerThreads = []
while not stateQueue.empty?
while workerThreads.length < numConcurrent
nextState = stateQueue.pop
nextWorker =
Thread.new(nextState) do |st|
workerBlock.call(st)
end
workerThreads.push(nextWorker)
end # inner while
workerThreads.delete_if{|th| not th.alive?} # clean up dead threads
end # outer while
workerThreads.each{|th| th.join} # join any remaining workers
end # asyncDispatcher
そして、私はそれを次のように呼び出します:
asyncDispatcher(2, (1..10).to_a ) {|x| x + 1}
ここに潜んでいるバグや並行性の落とし穴はありますか? それとも、このタスクを簡素化するランタイムの何かでしょうか?