在一个 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}
这里是否有任何潜在的错误或并发陷阱?或者也许运行时中的某些东西可以简化这项任务?