2016-11-11 4 views
0

Gibt es eine Möglichkeit zu wissen, aus welchem ​​Greenlet das aktuelle Greenlet in Gevent hervorgegangen ist?gevent find parent greenlet

  1. Ich weiß, dass das Greenlet, das das aktuelle Greenlet hervorgebracht hat, bereits beendet sein könnte, aber in diesem Fall wäre es okay, eine None als Antwort zu behandeln.
  2. Ich bin mir bewusst, gevent.Greenlet.parent aber dies stellt nur die Nabe, nicht die direkte greenlet aus dem der aktuellen greenlet von
  3. gestartet würde ich eine Lösung bevorzugen, die nicht Affen gevent.Greenlet
  4. Patchen mit sich bringt

Mein Anwendungsfall ist: Ich habe einen Server, der Anfragen zur Ausführung von Python-Code behandelt (ja, ja, es ist unsicher, ich weiß :-). Jede Anforderung erzeugt ein Greenlet, das die Anforderung verarbeitet, einschließlich der Umleitung aller Eingaben, Ausgaben oder Fehler in einen für die Anforderung privaten Kanal. Ich möchte in der Lage sein, Anfragen gleichzeitig zu bearbeiten, und die Anfragen können Greenlets selbst erzeugen.

Sie können ein Beispiel finden, was ich versuche here

Antwort

0

In Original greenlet Paket zu tun, neues greenlet Objekt erstellt hat die folgende Signatur greenlet(run=None, parent=None). Es bedeutet also, dass Sie parent Argument bereitstellen oder es None behalten können und Greenlet standardmäßig Anruferfunktion zuweist.

Zusätzlich zu diesem Paket bietet gevent Tools und eine kleine Ereignisschleife, die das Greenlets-Verhalten orchestriert und lifecycle. Jedes Greenlet, das von gevent.spawn oder gevent.Greenlet erstellt wird, erbt automatisch den aktuellen Hub (Ereignisschleife) als übergeordnetes Element. Jedes Mal, wenn ein Greenlet seine Ausführung beendet, überträgt es die Kontrolle zurück in die Ereignisschleife. Laut Dokumentation: "Dadurch kann ein Greenlet einige Bereinigungsaktionen durchführen, bevor es die Kontrolle übernimmt."

Allerdings, in der Dokumentation und source code der Greenlet-Initialisierung, sehe ich, dass es immer noch möglich ist, Konstruktor durch Bereitstellung neuer Argumente zu überschreiben.

from gevent.greenlet import Greenlet as GeventGreenlet 


class Greenlet(GeventGreenlet): 

    def __init__(self, caller=None, *args, **kwargs): 
     super(Greenlet, self).__init__(*args, **kwargs) 
     self._caller = caller 

Dann brauchen Sie greenlet Paket verwenden, um Ihre Greenlet Implementierung (ähnlich GEVENT monkeypatch) so früh wie möglich zu erzählen.

import gevent.greenlet 
from myapp.greenlet import Greenlet 

gevent.greenlet.Greenlet = Greenlet 
+0

Ich vermeide bereits Gevent Affe Patching, so dass ich eine Lösung bevorzugen würde, die nicht Affe Patching Gevent selbst beteiligt –