2016-05-03 13 views
2

Ich möchte 4 Threads starten, um jede 1 Sekunde in Python zu arbeiten. Um sicherzustellen, dass die Arbeit alle 1 Sek. Erledigt wird, habe ich nach dem Spawn einen Schlaf eingefügt, wie im folgenden Codeausschnitt gezeigt. Vom Drucken scheint es, dass die Anzahl der Male, die do_work ausgeführt wurde, 10 war, während ich 10 * 4 erwartete - die Anzahl der Schleifeniterationen x die Anzahl der Threads. Es scheint auch, dass der erste Thread die Arbeit nach 4 Sekunden ab der Zeit, die in der Hauptschleife gedruckt wurde, zu tun beginnt (ich habe die Zeit auch innerhalb des Threads gedruckt).Schlaf nach Spawn in Python

run_pool = GreenPool(4) 
    counter = 0 
    while counter < 10: 
     run_pool.spawn(self.do_work) 
     time.sleep(1) 
     counter += 1 
     print time.time() 

Antwort

1

Der Parameter für den Konstruktor für GreenPool ist die Anzahl der Worker-Threads, die verwendet werden. Wenn Sie die Nummer 4 übergeben, geben Sie an, dass Sie die Nummer self.do_work maximal vier Mal gleichzeitig anrufen soll. Seit du zehnmal spawn anrufst, hast du 10 "Jobs" in die Warteschlange gestellt, also so oft wie do_work aufgerufen werden. Der Grad der Parallelität (in diesem Fall 4) hat keinen Einfluss auf die Anzahl der ausgeführten Aufgaben, sondern begrenzt stattdessen die Anzahl der gleichzeitig ausgeführten Threads.

2

Zunächst sollten Sie read the documentation eine bessere Vorstellung davon bekommen, wie eventlet funktioniert und wie man es benutzt. Ich selbst habe nie eventlet verwendet, alles, was folgt, habe ich herausgefunden, indem ich die Dokumente für ein paar Minuten abgeschöpft habe.

es scheint, dass die Anzahl der Male do_work ausgeführt wurde 10 war, während ich 10 * 4

GreenPool.spawn() nur ein laicht pro Anruf Thread erwartet wurde. Die Größe des Pools begrenzt, wie viele Threads gleichzeitig ausgeführt werden können. Wenn alle Threads im Pool verwendet werden, wird spawn blockiert, bis ein Thread verfügbar wird.

es scheint, dass der erste Thread startet die Arbeit nach 4 Sekunden von der Zeit, in der Hauptschleife zu bedruckenden tun

Sie müssen monkey-patch das time Modul es freiwillig zu machen Steuerung während Ausbeute Schlafen. Da Sie dies nicht getan haben, können die erzeugten Threads nicht funktionieren, während der Haupt-Thread schläft. Daher werden die Threads nicht bis zur 4. Iteration der Schleife ausgeführt. An diesem Punkt kann der Haupt-Thread keine weiteren Threads mehr erzeugen, so dass er "blockiert" und den Worker-Threads die Kontrolle gibt.

Aufruf eventlet.monkey_patch() vor Ihrer Schleife wird das Problem beheben. Alternativ verwenden Sie eventlet.sleep() anstelle von time.sleep().