Wie kann ich töten alle threads?
In diesem Skript:
import threading, socket
class send(threading.Thread):
def run(self):
try:
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((url,port))
s.send(b"Hello world!")
print ("Request Sent!")
except:
s.close()
except KeyboardInterrupt:
# here i'd like to kill all threads if possible
for x in range(800):
send().start()
Ist es möglich, zu töten alle Fäden in der außer KeyboardInterrupt? Ich habe gesucht im Netz und ja, ich weiß, es wurde schon gefragt, aber ich bin wirklich neu in python und ich habe nicht so gut die Methode, die dieser Frage auf stack.
- Sie wollen, um zu töten alle threads... tut dies auch die Haupt-thread und als Konsequenz der Anwendung? Wenn ja, einfach machen, alle deine threads Dämonen und dann, wenn Sie beenden möchten, verwenden Sie
sys.exit()
. - Das hilft nicht, wenn die
KeyboardInterrupt
geliefert wird, zu einem der threads (der thread, der ihn empfängt, ist im Grunde zufällig IIRC). Damit die Notwendigkeit für die Alarmierung der Haupt-thread also kann esexit
zu der entsprechenden Zeit. - Recht @ShadowRanger, danke für den Hinweis it out, Gewinde neigen dazu, zu schlucken Ausnahmen. Als Hinweis, wenn ich den Umgang mit threads, die ich in der umgekehrten Ansatz: in einem thread die Schleife, wenn eine Taste gedrückt wurde (die Logik erweitert werden kann, basierend auf Schlüssel), Ende es.
- No way ! Socket Außengewinde. Legen Sie ein Zeitlimit für das automatische töten. Wie behandeln
*socket.error
?while True
ist schlechte Idee,while some_status_bolean
besser !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Einzelne threads können nicht gekündigt werden gewaltsam (es ist unsicher, da könnte es verlassen, sperren, führen zu deadlocks, u.a.).
Zwei Möglichkeiten, so etwas zu tun wäre entweder:
daemon
threads, mit der main-thread wartet auf einEvent
/Condition
und verlassen, sobald einer der Fäden setzt dieEvent
oder benachrichtigt denCondition
. Der Prozess endet, sobald die (alleinige) nicht-daemon
thread beendet wird, endet alle diedaemon
threadsEvent
dass alle threads poll zeitweise, so dass Sie kooperativ verlassen, kurz nachdem es eingestellt ist.Event
ändernwhile True:
zuwhile not myevent.is_set():
, und aufhören, über eine bloßeexcept
innerhalb der Schleife (es fängtKeyboardInterrupt
verhindern, dass Sie von der Verarbeitung ist es; fangenException
oder ähnliches). Dann, wenn Sie Sie zu fangenKeyboardInterrupt
rufenmyevent.set()
zu sagen, alle anderen threads zum beenden der Verarbeitung auf Ihre next-Schleife. Dies ist nicht schwer sich anzupassen, versuchen, spielen, um mit es, wenn es nicht sofort funktioniert.