具有递归使用的EM.next_tick

时间:2013-01-31 06:56:11

标签: ruby eventmachine

# 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”。我对吗?为什么会这样?

1 个答案:

答案 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个滴答中一次生成一名工人