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によって使用されるEMinteratorからコードのこの部分を読み取りました。

私はEventmachinの基本的な考え方を持っていますが、next_tickのこの種の再帰的な使用法についてはよくわかりません。誰かが、このplzについて説明してもらえますか?

私の意見では、「while」や「for」ではなく、EMによって処理されるループのようなものです。私は正しいですか?そして、なぜこれ?

4

1 に答える 1

0

これは実際には再帰呼び出しではありません。「しばらくして proc が発生するようにスケジューリングする」と考えてください。

EventMachine は基本的に、ループの次の反復 (次のティック) で発生するようにスケジュールされた処理を実行する無限ループです。

コマンド キューイング メカニズムとして next_tick メソッドを想像してみてください。

spawn_workers メソッドは、イベント ループの次の繰り返しで start_worker proc が発生するようにスケジュールします。

次の EM ループ反復start_workerproc が実行され、@process_next.callワー​​カーが生成されると想定されるため、最初のワーカーがインスタンス化され、コマンドが発生します。

      EM.next_tick(start_worker)

すべてのワーカーが生成されるまで、EM ループの次の繰り返しで同じブロックが発生するようにスケジュールします。

これは、たとえば、8 つのワーカーをインスタンス化する必要がある場合、イベント ループの次の 8 ティックで一度に 1 つのワーカーが生成されることを意味します。

于 2013-11-13T09:28:53.320 に答える