Putting einen thread schlafen, bis Ereignis X Eintritt
Ich bin das schreiben, um viele Dateien in einer Multithread-Anwendung und ich bin momentan dabei, einen handler pro file. Ich habe HandlerFactory-Klasse, verwaltet die Verteilung dieser Handler. Was ich tun möchte, ist, dass
thread Anfragen und bekommt foo.txt's Datei-handle aus der HandlerFactory-Klasse
thread B fordert foo.txt's Datei-handler
handler-Klasse erkennt, dass dieser Datei-handle wurde ausgecheckt
handler-Klasse legt, den Faden zu schlafen
thread B schließt Datei-handle, das mit einem wrapper-Methode von HandlerFactory
HandlerFactory benachrichtigt sleeping-threads
thread B wird aktiviert und erfolgreich wird foo.txt's Datei-handle
Dies ist, was ich habe, so weit,
def get_handler(self, file_path, type):
self.lock.acquire()
if file_path not in self.handlers:
self.handlers[file_path] = open(file_path, type)
elif not self.handlers[file_path].closed:
time.sleep(1)
self.lock.release()
return self.handlers[file_path][type]
Ich glaube, das deckt die Schlaf-und hf Abruf erfolgreich, aber ich bin nicht sicher, wie Sie aufwachen, werden alle threads, oder noch besser aufwachen einen bestimmten thread.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie suchen, ist bekannt als eine Zustand-variable.
Condition-Variablen
Hier ist die Python-2-Bibliothek-Referenz.
Für Python 3 kann es gefunden werden hier
Sieht aus wie Sie wollen, eine threading.Semaphore im Zusammenhang mit der jeweiligen handler (andere Synchronisations-Objekte wie Ereignisse und Bedingungen sind auch möglich, aber ein Semaphor scheint die einfachste für Ihre Bedürfnisse). (Verwenden Sie insbesondere eine BoundedSemaphore: für Ihren Fall, wird eine Ausnahme auslösen, sofort für Fehler in der Programmierung, die fälschlicherweise release der semaphone mal mehr, als Sie es erworben haben-und das ist genau der Grund für die begrenzt version von semaphones;-).
Initialisieren jede semaphore auf einen Wert von
1
wenn Sie es bauen (also das bedeutet, dass der handler ist verfügbar). Jede Verwendung-thread-Aufrufeacquire
auf das semaphor um den Hundeführer (das kann es blockieren), undrelease
drauf, wenn es fertig ist mit der hf (hervorbringen und genau einer der wartenden threads). Das ist einfacher als das erwerben/wait/notify/release Lebenszyklus einer Bedingung, und mehr zukunftssicher auch, da die docs für Zustand sagen:während mit einem Semaphor spielen Sie es sicher (die Semantik wovon sind sicher verlassen können: wenn ein semaphor wird initialisiert, N, gibt es zu allen Zeiten zwischen 0 und N-1 - [[enthalten]] - threads, die haben erfolgreich erworben wurden, die semaphore und noch nicht freigegeben haben).
Dir ist schon klar, dass Python hat ein riesiges Schloss, so dass die meisten der Vorteile der multi-threading, die Sie nicht bekommen, richtig?
Es sei denn, es besteht Grund für die master-thread etwas zu tun, was mit den Ergebnissen der einzelnen Arbeiter, möchten Sie vielleicht zu prüfen, nur die Verzweigung von einem anderen Prozess für jede Anforderung. Sie nicht haben, um mit sperren Probleme dann. Haben die Kinder das tun, was Sie tun müssen, dann sterben. Wenn Sie brauchen, um wieder zu kommunizieren, tun Sie es über ein Rohr, mit XMLRPC, oder durch eine sqlite-Datenbank (was ist threadsicher).