Warum ist 'gevent.spawn' anders als ein monkeypatched 'threading.Thread ()'?

8

Während ich überprüfe, dass threading.Condition korrekt mit Affen gepatcht ist, habe ich festgestellt, dass sich ein monkeypatch threading.Thread(…).start() anders verhält als gevent.spawn(…) .

Überlegen Sie:

%Vor%

Beachten Sie insbesondere die beiden Kommentare, die mit XXX beginnen.

Bei Verwendung der ersten Zeile (mit gevent.spawn ) löst der erste thread.join() eine Ausnahme aus:

%Vor%

Jedoch, Thread(…).start() (der zweite Block), alles funktioniert wie erwartet.

Warum sollte das sein? Was ist der Unterschied zwischen gevent.spawn() und Thread(…).start() ?

    
David Wolever 23.10.2012, 22:43
quelle

1 Antwort

5

Was in Ihrem Code passiert, ist, dass die greenlets , die Sie in Ihrer threads -Liste erstellt haben, noch nicht ausgeführt werden konnten, weil gevent erst dann einen Kontextwechsel auslöst Sie tun dies explizit in Ihrem Code mit gevent.sleep() und so oder implizit durch Aufruf einer Funktion, die zB blockt semaphore.wait() oder by yielding und so weiter ..., um zu sehen, dass Sie einen Druck vor cv.wait() einfügen können und sehen, dass es erst aufgerufen wird, nachdem cv.notify_all() aufgerufen wurde:

%Vor%

Eine einfache Lösung für Ihren Code ist also, etwas einzufügen, das einen Kontextwechsel auslöst, nachdem Sie Ihre Liste mit greenlets erstellt haben, Beispiel:

%Vor%

Hinweis: Ich bin immer noch neu bei gevent , also weiß ich nicht, ob dies der richtige Weg ist:)

Auf diese Weise haben alle greenlets die Möglichkeit, ausgeführt zu werden, und jede von ihnen löst einen Kontextwechsel aus, wenn sie cv.wait() aufrufen, und in der Zwischenzeit werden sie es tun Registrieren Sie sich selbst bei den Condition Kellnern, so dass% code_% heißt benachrichtigt alle greenlets .

HTH,

    
mouad 23.10.2012, 23:28
quelle

Tags und Links