Python - Threading und eine While True Schleife
Ich habe einen thread, der fügt die Zeilen selbst.Ausgabe und eine Schleife, die läuft, bis selbst.fertig ist Wahr (oder die max execution time erreicht ist).
Ist es ein effizienter Weg, dies zu tun, andere als die Verwendung einer while-Schleife, die ständig überprüft, um zu sehen, wenn es fertig ist. Die while-Schleife bewirkt, dass die CPU auf spike zu 100%, während es läuft..
time.clock()
while True:
if len(self.output):
yield self.output.pop(0)
elif self.done or 15 < time.clock():
if 15 < time.clock():
yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
break
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind deine threads Anhängen zu sich selbst.Ausgabe hier, mit Ihrer wichtigsten Aufgabe, die Sie verbraucht? Wenn ja, ist dies ein maßgeschneiderter job für Warteschlange.Warteschlange. Ihr code sollte so etwas wie:
Ihre Produzenten-threads hinzufügen von Elementen in die Warteschlange mit
queue.put(item)
[Bearbeiten] Der ursprüngliche code hat ein Rennen-Problem, wenn die überprüfung selbst.durchgeführt (zum Beispiel mehrere Elemente angehängt werden könnten, die Warteschlange vor dem das flag gesetzt ist, wodurch die code-bail-out in der erste). Aktualisiert mit einem Vorschlag von ΤΖΩΤΖΙΟΥ - die Produzenten-thread, der sollte stattdessen fügen Sie ein spezielles token (Fertig), um die Warteschlange anzuzeigen, dass es abgeschlossen ist.
Hinweis: Wenn Sie mehrere producer-threads, Sie müssen einen allgemeineren Ansatz zu erkennen, wenn Sie fertig ist. Sie können dies erreichen, mit der gleichen Strategie - jeder thread eine Fertige marker und den Verbraucher beendet, wenn es sieht num_threads Marker.
done_marker= object()
und verwenden Sie diese, oder verwenden Sie das Ellipse-Objekt (sonst nutzlos in der Regel).if self.done: break
sollte geändert werden zu:if self.done and self.queue.empty(): break
, sonst die letzten Einträge in der Warteschlange nicht unbedingt enthalten sein. hat mich ein bisschen und spielt mit ihm, um das herauszufinden.Verwenden einen semaphor; die Arbeits-thread loslassen, wenn es fertig ist, und sperren thread Anhängen, bis die Arbeiter fertig mit der semaphore.
ie. in der Arbeiter -, etwas tun, wie
self.done = threading.Semaphore()
am Anfang der Arbeit, undself.done.release()
wenn Sie fertig sind. In dem code, den Sie oben erwähnt, statt der busy-loop, einfachself.done.acquire()
; wenn der worker-thread beendet ist, übernimmt wieder die Steuerung.Edit: ich fürchte, dass ich nicht die benötigte timeout-Wert, obwohl, das Problem beschreibt die Notwendigkeit für eine semaphore timeout in der standard-Bibliothek.
Zeit benutzen.sleep(Sekunden) zu erstellen, eine kurze pause nach jeder iteration der while-Schleife verzichten die cpu. Haben Sie die Zeit einstellen, die Sie schlafen während jeder iteration basierend auf, wie wichtig es ist, dass Sie fangen den job schnell, nachdem es beendet ist.
Beispiel:
verwenden mutex-Modul oder event/semaphore
Müssen Sie eine Synchronisierung primitiv hier. Schau mal hier: http://docs.python.org/library/threading.html.
Ereignis-Objekte scheinen sehr einfach und sollte Ihr problem lösen. Sie können auch verwenden Sie eine Bedingung, Objekt oder eine semaphore.
Ich nicht post ein Beispiel, weil ich habe noch nie verwendet, Ereignis-Objekte, und die alternativen sind wohl weniger einfach.
Edit: ich bin mir nicht wirklich sicher, ob ich Verstand Ihr problem. Wenn ein thread warten kann, bis eine Bedingung ist statisfied, die Synchronisierung verwenden. Ansonsten ist die
sleep()
Lösung, die jemand geschrieben wird, über die Einnahme von zu viel CPU-Zeit.