1
# 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的这种递归用法不是很清楚,有人能给我解释一下吗?

在我看来,它就像一个循环,由 EM 处理,而不是“while”或“for”。我对吗?为什么会这样?

4

1 回答 1

0

这不是真正的递归调用,可以将其视为“安排稍后发生的过程”,

EventMachine 基本上是一个无限循环,它执行计划在循环的下一次迭代(下一个滴答声)中发生的事情,

把 next_tick 方法想象成一个命令队列机制,

spawn_workers 方法安排 start_worker 过程发生在事件循环的下一次迭代中。

在下一个 EM 循环start_worker中,将运行迭代 proc,并且@process_next.call会发生我假设会产生 worker,因此第一个 worker 被实例化,命令

      EM.next_tick(start_worker)

安排相同的块在 EM 循环的下一次迭代中发生,直到所有工作人员都产生。

这意味着,例如,如果需要实例化 8 个工作人员,则在事件循环的接下来 8 个滴答声中一次生成一个工作人员

于 2013-11-13T09:28:53.320 回答