Seite 1 von 1

concurrent.futures.ThreadPoolExecutor zum beenden zwingen

Verfasst: Dienstag 9. Juli 2013, 15:20
von init-0
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?

Re: concurrent.futures.ThreadPoolExecutor zum beenden zwinge

Verfasst: Dienstag 9. Juli 2013, 15:51
von 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.

Re: concurrent.futures.ThreadPoolExecutor zum beenden zwinge

Verfasst: Dienstag 9. Juli 2013, 16:39
von init-0
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

Re: concurrent.futures.ThreadPoolExecutor zum beenden zwinge

Verfasst: Mittwoch 10. Juli 2013, 16:44
von Boa
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.