2010-11-24 17 views
29

Mein unvollständiges Verständnis ist, dass Twisted, Stackless, Greenlet, Eventlet, Coroutines alle async Netzwerk IO und Userland-Threads verwenden, die sehr leicht und schnell zu wechseln sind. Aber ich bin nicht sicher, was die Unterschiede zwischen ihnen sind.Python/Erlang: Was ist der Unterschied zwischen Twisted, Stackless, Greenlet, Eventlet, Coroutines? Sind sie Erlang-Prozessen ähnlich?

Sie klingen auch sehr ähnlich zu Erlang-Prozessen. Sind sie ungefähr das Gleiche?

Jeder, der mir helfen könnte, dieses Thema mehr zu verstehen, würde sehr geschätzt werden.

Antwort

35

Zunächst einmal hat nicht blockierende E/A nichts mit grünen Threads oder Coroutinen zu tun, aber es kann sich auf ihre Planung auswirken.

Jetzt:

  • Twisted ist ein klassischer nicht blockierende E/A-Rahmen - Anwendungscode geschrieben wird in asynchronen Callbacks verwendet.
  • Gevent und eventlet Verwenden Sie die greenlet Bibliothek für Coroutines/Greenthreads/Greenlets. Es gibt ein dediziertes Greenlet zum Ausführen der Eventloop (im Fall von gevent ist es C-codierte libevent's Event-Loop). Wenn ein beliebiges Greenlet auf die Verarbeitung einiger E/A-Operationen wartet, wird die Ereignisschleife ausgeführt, wodurch ein weiteres Greenlet zur Ausführung gestartet wird (das bereit ist, einige E/A auszuführen). Dies nennt man kooperatives Multitasking - jedes Greenlet entscheidet selbst, wann es die Kontrolle an andere Greenlets zurückgibt.
  • Stackless hat Tasklets, die Greenlets ähnlich sind, aber auch mit einem Präemptivmodell eingeplant werden können - das bedeutet, dass der Scheduler jederzeit die Ausführung des Tasklets stoppen und die Ausführung eines anderen Tasklets starten kann (wie OS-Threads und Erlang-Prozesse) Arbeit). Außerdem stellt Stackless keine nicht blockierenden E/A-Funktionen bereit, wenn Sie I/O über stdlib ausführen - es blockiert den gesamten Betriebssystem-Thread, sodass kein anderes Tasklet ausgeführt werden kann, während Sie auf I warten /O. Es gab Versuche, einen Port der gevent-Bibliothek für Stackless bereitzustellen, aber ich weiß nicht, wie es läuft.
+3

Twisted ermöglicht auch das Schreiben asynchronen Codes ohne Verwendung von Callbacks und Zustandsmaschinen über den 'twisted.internet.defer.inlineCallbacks'-Dekorator, der es dem Programmierer ermöglicht, Generator (' Yield') basierte Koroutinen zu verwenden, um deutlich lesbareren Code zu erhalten als mit Callbacks . –

+0

* Es gibt ein eigenes Greenlet zum Ausführen der Eventloop (...) * Könnte nicht mehr als ein Greenlet einen eigenen Eventloop haben, der es diesen Eventloops ermöglichen würde, * zusammenzuarbeiten *? –

10

Köder genommen! (Fixe gern gesehen!):

Grossly:

  • twisted: single threaded. erreicht blockierungsfreies Verhalten durch Verwendung von Callbacks und Deferred-Idiomen. Ähnlich wie node.js.
  • Greenlet/Eventlet: Verwenden Sie "grüne Fäden" (Abschnitte des Speichers?), Um nicht blockierende io zu erreichen. Passt die Standard-CPython-IO mit ihren Versionen an, so dass Code immer noch so geschrieben wird, als wäre er blockierend/sequenziell.
  • stapellos: http://www.stackless.com/. Habe es nicht benutzt, sieht aus wie es "Mikrothreads" und andere Nettigkeiten hinzufügt? stackless example idioms
  • Koroutinen: coroutines on SO

Keiner von ihnen sind als Licht oder als Erlang Prozesse gut unterstützt.

+0

Twisted ist nicht single-threaded an sich, es hat erstklassige Unterstützung für Threading und Threadpools. Außerdem verwendet (zumindest) seine Datenbank-API Threads standardmäßig. (Siehe auch meinen Kommentar zu der Antwort von andreypopp) –

+0

Auch, wie andreypopp sagte, haben Greenlets nichts mit nicht-blockierenden IO zu tun - die beiden sind orthogonal. –

8

Sie haben fast Recht, wenn Sie Stackless mit Greenlet vergleichen. Die fehlende Sache ist:

Stackless per se nicht hinzufügen etwas.Stattdessen hat Greenlet, erfunden 5 Jahre nach Stackless, bestimmte Dinge entfernt. Es ist so einfach geschrieben, dass es als Erweiterungsmodul anstelle eines Ersatzinterpreters gebaut werden kann.

Dies ist wirklich lustig-Stackless hat viele weitere Funktionen, ist etwa 10-mal effizienter beim Umschalten und bietet Beizen des Ausführungsstatus.

Greenlet gewinnt immer noch, wahrscheinlich nur wegen der Benutzerfreundlichkeit als Erweiterungsmodul. Ich denke also darüber nach, den Prozess rückgängig zu machen, indem wir Greenlet mit Beizen verlängern. Vielleicht würde das das Bild wieder verändern :-)