Python / Erlang: Was ist der Unterschied zwischen Verdreht, Stackless, Greenlet, Eventlet, Koroutinen? Sind sie ähnlich wie Erlang Prozesse?

StackOverflow https://stackoverflow.com/questions/4263059

Frage

Mein unvollständiges Verständnis ist, dass Verdreht, Stackless, Greenlet, Eventlet, Koroutinen alle nutzen Asynchron-Netzwerk IO und Userland-Threads, die sehr leicht sind und schnell zu wechseln. Aber ich bin sicher nicht das, was sind die Unterschiede zwischen ihnen.

sie klingen auch sehr ähnlich wie Erlang Prozesse. Sind sie so ziemlich das Gleiche?

Wer mir dieses Thema zu verstehen helfen könnte wäre sehr dankbar.

War es hilfreich?

Lösung

Zu allererst nicht blockierende E / A hat nichts gemein mit grünen Fäden oder Koroutinen, aber es kann beeinflussen, wie sie geplant sind.

  • Verdrehte ist ein Klassiker nicht blockierende E / A-Rahmen - Anwendungscode in Asynchron-Stil geschrieben wird mit Rückrufen .
  • GEVENT und eventlet verwenden, um die greenlet Bibliothek für Koroutinen / greenthreads / greenlets. Es gibt eine spezielle greenlet die Ereignisschleife für den Lauf (bei GEVENT es ist C-Coded libevent 's Ereignisschleife). Wenn beliebige greenlet für einige I / O-Operation Prozess zu warten beginnt, gibt es nur die Ausführung der Ereignisschleife, die eine andere greenlet für die Ausführung beginnt (die einige I / O bereit ist zu tun). Dies wird kooperatives Multitasking genannt -. Jeder greenlet selbst entscheidet, wann Kontrolle an andere greenlets zurückzukehren
  • Stackless hat Tasklets, die greenlets ähnlich sind, kann aber auch mit einem Präventivmodell geplant werden - das bedeutet, dass der Planer die Tasklet Ausführung jederzeit stoppen und Ausführung eines anderen Tasklet starten (was, wie die Arbeit OS Threads und Erlang-Prozesse ist). Auch dann, wenn Stackless nicht bieten keine nicht-blockierende E / A-Einrichtungen aus der Box, wenn Sie also tun I / O über stdlib - es wird das gesamte OS-Thread blockieren, so dass keine weiteren Tasklet können, während Sie warten auf I ausführen /Ö. Es gibt Versuche, einen Hafen GEVENT Bibliothek für Stackless zur Verfügung zu stellen, aber ich weiß nicht, wie es geht.

Andere Tipps

Bait genommen! (Fixe willkommen!):

Grossly:

  • verdreht: single threaded. Verhalten durch die Verwendung von ‚Callbacks‘ und ‚latenten‘ Idiomen erzielt eine non-blocking. Ähnlich node.js.
  • greenlet / eventlet: Verwendung 'grüne Fäden' (? Speicherabschnitte) zu erreichen, nicht blockierenden io. Eigentlich Patches den Standard CPython IO mit ihren Versionen, so Code noch geschrieben wird, als ob es blockiert / sequentiell.
  • stackless: http://www.stackless.com/ . Haben Sie es nicht, sieht aus wie es Microthreads 'und anderen Nettigkeiten fügt hinzu? stackless Beispiel Idiome
  • Koroutinen: Koroutinen auf SO

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

Sie sind fast richtig, wenn Stackless Vergleich zu Greenlet. Die fehlende Sache ist:

Stackless per se nicht Hinzufügen etwas. Stattdessen entfernt Greenlet, erfunden von 5 Jahren nach Stackless, bestimmte Dinge. Es ist einfach genug geschrieben als Erweiterungsmodul gebaut werden anstelle eines Ersatz-Interpreter.

Das ist wirklich lustig-Stackless viele weitere Features hat, ist etwa 10-mal effizienter beim Schalten und stellt der Ausführungszustand Beizen.

Greenlet gewinnt immer noch, wahrscheinlich nur wegen der Verwendung als Erweiterungsmodul zu erleichtern. Also ich denke an den Prozess zurückkehrt durch Greenlet erstreckt, um mit dem Beizen. Vielleicht, das würde das Bild wieder ändern: -)

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