4

サンプルコードはここからです:

def http_get(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get

  # resume fiber once http call is done
  http.callback { f.resume(http) }
  http.errback  { f.resume(http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    page = http_get('http://www.google.com/')
    puts "Fetched page: #{page.response_header.status}"

    if page
      page = http_get('http://www.google.com/search?q=eventmachine')
      puts "Fetched page 2: #{page.response_header.status}"
    end
  }.resume
end

したがって、EM実行ブロックのコンテキストでは、作成者はファイバーを作成し、それをですぐに実行しresumeます。http_getしかし、なぜロジックがそのように構成されているのかわかりません。つまり、現在のファイバー(この場合はEM実行ブロックで作成されたもの)を取得し、失敗または成功する可能性のあるhttp要求を開始し、現在のファイバーを再開します。その後、それはただyieldファイバーを要求します。彼がyieldと呼んでいるので、正確には何が実行されますか?http_getなぜそのように書かれているのか説明してもらえますか?

4

1 に答える 1

3
  1. EventMachine でファイバーが作成され、トリガーされる
  2. 目標は、(a) ページを取得することと、(b) そのページで作業することです。
  3. ページがフェッチされるまでファイバーを一時停止する必要があります。これは、http_get
  4. http = EventMachine::HttpRequest.new(url).get何もトリガーしません: EventMachine は手綱を取り戻す必要があります。Fiber.yield
  5. EventMachine がページを取得するジョブを完了すると、コールバックがトリガーされ、停止していたファイバーが再開されます。puts ...

より明確ですか?

于 2012-09-30T16:35:32.757 に答える