Frage

Es gibt viele Fragen im Zusammenhang mit Stackless Python. Aber keiner dieser Beantwortung meiner Frage, ich denke (korrigieren Sie mich, wenn falsch - bitte!). Es gibt einige Summen über es die ganze Zeit so neugierig ich zu wissen. Was würde ich Stackless für? Wie ist es besser als CPython?

Ja, es hat grüne Fäden (stackless), die schnell viele leichten Fäden so lange erstellen lassen, da keine Operationen blockieren (so etwas wie Rubys Fäden?). Was ist das ideal für? Was andere Features, die es hat möchte ich CPython verwenden, um über?

War es hilfreich?

Lösung

Es ermöglicht Ihnen, mit riesigen Mengen an Gleichzeitigkeit zu arbeiten. Niemand gesund schaffen würde hunderttausend System-Threads, aber Sie können dies mit stackless tun.

In diesem Artikel Tests genau das zu tun, die Schaffung hunderttausend Tasklets sowohl in Python und Google Go (eine neue Programmiersprache): http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

überraschend, auch wenn Google Go zu nativen Code kompiliert wird, und sie tout ihre Co-Routinen Implementierung Python gewinnt immer noch.

Stackless würde für die Implementierung einer Karte gut / reduzieren Algorithmus, wo Sie eine sehr große Anzahl von Reduzierungen haben je nach Eingabedaten.

Andere Tipps

Stackless Pythons Hauptvorteil ist die Unterstützung für sehr leichte Koroutinen. CPython nicht unterstützt Koroutinen nativ (obwohl ich jemand erwarten einen Generator-basierten Hack in den Kommentaren posten) so Stackless eine deutliche Verbesserung auf CPython ist, wenn Sie ein Problem haben, die von Koroutinen zugute kommt.

ich glaube, der Hauptbereich, in dem sie übertreffen ist, wenn Sie viele gleichzeitigen Aufgaben in Ihrem Programm ausgeführt haben. Beispiele könnten Spiel Einheiten sein, die eine Looping-Skript für ihre KI oder ein Web-Server ausführen, die viele Kunden mit Seiten bedient, die langsam zu erstellen.

Sie haben noch viele der typischen Probleme mit Parallelität Korrektheit jedoch gemeinsam genutzte Daten in Bezug auf, aber der deterministische Aufgabenwechsel erleichtert sicheren Code zu schreiben, da Sie genau wissen, wo die Steuerung übertragen wird und wissen daher genau die Punkte, an denen die gemeinsamen Staat muss auf dem neuesten Stand sein.

Thirler bereits erwähnt, dass stackless in Eve Online verwendet wurde. Denken Sie daran, dass:

  

(..) stackless fügt eine weitere Wendung dies, indem sie Aufgaben in kleinere Aufgaben zu trennen, Tasklets, die dann das Hauptprogramm abgespalten werden können alleine auszuführen. Dies kann verwendet werden, um Aufgaben fire-and-forget, wie eine E-Mail aus, oder ein Ereignis ausgelöst wird, oder für IO-Operationen, z.B. Senden und Empfangen von Netzwerkpaketen. Ein Tasklet für ein Paket aus dem Netzwerk wartet, während andere weiterhin das Spiel Schleife ausgeführt wird.

     

Es ist in gewisser Weise wie Fäden, ist aber nicht präemptiven und explizit geplant, so gibt es weniger Probleme mit der Synchronisation. Auch zwischen Tasklets Schalt ist viel schneller als Threadwechsel, und Sie können eine große Anzahl von aktiven Tasklets haben, während die Anzahl der Threads stark von der Computer-Hardware beschränkt ist.

(habe dieses Zitat von hier )

Bei PyCon 2009 dort gegeben wurde, ein sehr interessantes Gespräch , beschreibt, warum und wie Stackless bei CCP Games verwendet wird.

Auch ist es eine sehr gute

ist EVE Online weitgehend in Stackless Python programmiert. Sie haben mehrere DevBlogs über die Verwendung davon. Es scheint, es ist sehr nützlich für High Performance Computing ist.

Während ich nicht benutzt habe Stackless selbst, habe ich Greenlet für die Implementierung hoch Concurrent-Netzwerkanwendungen eingesetzt. Einige der Anwendungsfälle Linden Lab hat es gegenüber gestellt sind: High-Performance-Smart-Proxies, ein schnelles System für Befehle über große Anzahl von Maschinen zu verteilen, und eine Anwendung, die eine Tonne Datenbank schreibt tut und liest (in einem Verhältnis von etwa 1 : 2, die sehr schreib schwer ist, so die meiste Zeit wartet es die Ausgaben für die Datenbank) zurückzukehren, und eine für die interne Web-Daten Web-Crawler-Typ-Sache. Grundsätzlich kann jede Anwendung, die eine Menge von Netzwerk zu tun zu haben, ist erwartete I / O von der Möglichkeit profitieren, wird eine bajillion leichte Threads zu erstellen. 10.000 angeschlossenen Clients wie eine große Sache scheint mir nicht.

Stackless oder Greenlet ist nicht wirklich eine komplette Lösung, though. Sie sind sehr schwach- und Sie gehen zu müssen, eine Menge monkeywork tun, um eine Anwendung zu ihnen aufzubauen, die sie zu ihren vollsten verwendet. Ich weiß das, weil ich eine Bibliothek pflegen, die eine Netzwerk- und Scheduling-Schicht oben auf Greenlet bietet, insbesondere weil Apps schreiben, ist so viel einfacher, mit ihm. Es gibt eine Reihe von diesen jetzt; Ich behaupte Eventlet, sondern es besteht auch concurrence, Chiral, und wahrscheinlich ein paar mehr, dass ich nicht kenne.

Wenn die Art von Anwendung, die Sie klingt wie schreiben will, was ich geschrieben habe, eine dieser Bibliotheken in Betracht ziehen. Die Wahl des Stackless vs Greenlet ist etwas weniger wichtig als die Entscheidung, welche Bibliothek am besten auf die Bedürfnisse von dem, was Sie tun mögen.

Der Grund Nützlichkeit für grüne Themen, so wie ich es sehe, ist es, ein System zu implementieren, in dem Sie eine große Menge von Objekten, die ein hohe Latenz Operationen ausführen. Ein konkretes Beispiel mit anderen Maschinen kommunizieren würde:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

Themen können Sie den obigen Code natürlich schreiben, aber wenn die Anzahl der Objekte groß genug ist, können Threads ausführen einfach nicht ausreichend. Aber können Sie grüne Fäden verwenden, auch für in wirklich großen Mengen. Die request_information() oben könnte das Gerät, bis zu einem gewissen Scheduler, wo andere Arbeit wartet und später zurückkommen. Sie erhalten alle Vorteile nennen zu können „Sperrung“ Funktionen als ob sie sofort zurück ohne Gewinde verwendet wird.

Das ist natürlich sehr nützlich für jede Art von verteilten Computing, wenn Sie Code auf einfache Art und Weise schreiben mögen.

Es ist auch interessant für mehrere Kerne für Schlösser zu mildern warten:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

Die green_lock Funktion versuchen würde, im Grunde um die Sperre zu erwerben und nur zu einem Haupt Scheduler wechseln, wenn es durch andere Kerne nicht das Objekt.

Auch hier sind grüne Fäden verwendet werden, blockieren zu mildern, Code, den es gut natürlich geschrieben werden und immer noch durchführen.

scroll top