Frage

Der Beispielcode stammt von Hier:

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

Im Kontext des EM-Run-Blocks erstellt der Autor also eine Faser und führt sie sofort aus resume.Aber ich verstehe nicht, warum das http_get Die Logik ist auf diese Weise strukturiert.Ich meine, es nimmt die aktuelle Glasfaser (die in diesem Fall die im EM-Laufblock erstellte sein sollte), startet eine http-Anfrage, die fehlschlagen oder erfolgreich sein kann, und nimmt die aktuelle Glasfaser wieder auf.Danach ruft es einfach yield auf der Faser.Was genau wird laufen, seit er Yield nennt?Kann mir bitte jemand erklären, warum http_get ist so geschrieben wie es ist?

War es hilfreich?

Lösung

  1. Fiber wird in EventMachine erstellt und ausgelöst
  2. Das Ziel besteht darin, (a) eine Seite abzurufen und (b) daran zu arbeiten
  3. Die Fiber sollte angehalten werden, bis die Seite abgerufen wird. Dies ist die Aufgabe von http_get
  4. http = EventMachine::HttpRequest.new(url).get löst nichts aus:EventMachine muss die Zügel wieder in die Hand nehmen, das ist die Aufgabe von Fiber.yield
  5. Sobald EventMachine die Aufgabe zum Abrufen der Seite erledigt hat, löst es den Rückruf aus und setzt die Fiber fort, bei der angehalten wurde puts ...

Klarer?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top