# Spawn workers to consume items from the iterator's enumerator based on the current concurrency level.
def spawn_workers
EM.next_tick(start_worker = proc{
if @workers < @concurrency and !@ended
# p [:spawning_worker, :workers=, @workers, :concurrency=, @concurrency, :ended=, @ended]
@workers += 1
@process_next.call
EM.next_tick(start_worker)
end
})
nil
end
我从EM-sychrony#fiberd_interator使用的EM interator中读取了这部分代码。
我对Eventmachin有一些基本的想法,但是我不太清楚next_tick的这种递归用法,有没有人能给我一个关于这个plz的解释?
在我看来,它就像一个循环,而它由EM处理,而不是“while”或“for”。我对吗?为什么会这样?
答案 0 :(得分:0)
这不是一个真正的递归调用,将其视为“安排过程发生一段时间后”,
EventMachine基本上是一个无限循环,可以完成在循环的下一次迭代中发生的事情(下一个刻度),
想象一下next_tick方法作为命令排队机制,
spawn_workers方法安排start_worker proc在事件循环的下一次迭代中发生。
在下一个EM循环中,将运行start_worker
proc并且将发生@process_next.call
,我假设它会生成工作者,因此第一个worker被实例化,命令
EM.next_tick(start_worker)
计划在EM循环的下一次迭代中发生相同的块,直到产生所有工人。
这意味着,例如,如果需要实例化8名工作人员,则会在事件循环的后8个滴答中一次生成一名工人