concurrent.futures.ThreadPoolExecutor zum beenden zwingen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Hallo,

ich hab in meinem Programm den concurrent.futures.ThreadPoolExecutor verwendet um loops auszuführen, und möchte diese beim Beenden vom Programm abbrechen, da das Programm sonst nicht beendet.

Code: Alles auswählen

>>> from concurrent.futures import ThreadPoolExecutor as TPE
>>> def loop():
	while True:
		pass
>>> f = threadpool.submit(loop)
>>> f.cancel()
False
>>> f.running()
True
>>> threadpool.shutdown(False)
>>> f.running()
True
>>> 
Ich bekomme es einfach nicht hin das Future objekt zu beenden.
Und einen loop zu bauen der auf eine globale variable prüft kann ich auch nicht benutzen, weil ich im loop socket.recv aufrufe und das nicht unterbricht.

Code: Alles auswählen

>>> running = True
>>> def loop():
	while running:
		sock.recv(1024) # läuft nicht weiter, bis die bytes empfangen sind.
Gibt es eine Möglichkeit den threadpool irgendwie zu beenden? del und auf den Garbagecollector warten habe ich auch schon versucht, klappt leider auch nicht.
Alternativ: gibt es eine Möglichkeit sock.recv und sock.accept abzubrechen?
Oder sollte ich in dem Programmteil lieber das threading modul verwenden?
BlackJack

@init-0: Die Frage ist ob die Workerfunktion zu Futures passt. Normalerweise sollte die ja ein Ergebnis liefern und nicht endlos etwas tun.

`cancel()` hat nur einen Effekt wenn die Funktion zum Future noch gar nicht gestartet wurde.
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Gibt es denn ein anderes ThreadPool modul, das dafür geeignet ist?

Edit: hab gerade das hier gefunden: http://stackoverflow.com/questions/3033 ... ssing-pool
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Guck dir mal die

Code: Alles auswählen

settimeout()
Methode des Sockets an oder besser das select Modul

Code: Alles auswählen

select.select()
Ansonsten kannst du ja auch einfach eine Abbruch Nachricht definieren und diese an den Prozess schicken.
Antworten