Ist es möglich, einen laufenden Thread zu beenden, ohne irgendwelche Flags/Semaphoren/etc. zu setzen/zu überprüfen?
Antworten
Zu viele Anzeigen?Pieter Hintjens - einer der Gründer der ØMQ -Projekt -- sagt, dass die Verwendung von ØMQ und die Vermeidung von Synchronisationsprimitiven wie Locks, Mutexes, Events etc. der vernünftigste und sicherste Weg ist, Multi-Thread-Programme zu schreiben:
http://zguide.zeromq.org/py:all#Multithreading-with-ZeroMQ
Dazu gehört auch, einem untergeordneten Thread mitzuteilen, dass er seine Arbeit abbrechen soll. Dies würde geschehen, indem man den Thread mit einem ØMQ-Socket ausstattet und auf diesem Socket eine Nachricht abfragt, die besagt, dass er abbrechen soll.
Der Link bietet auch ein Beispiel für Multithreading-Python-Code mit ØMQ.
Sie können Ihren Befehl in einem Prozess ausführen und ihn dann mit Hilfe der Prozess-ID beenden. Ich musste zwischen zwei Threads synchronisieren, von denen einer nicht von selbst zurückkehrt.
processIds = []
def executeRecord(command):
print(command)
process = subprocess.Popen(command, stdout=subprocess.PIPE)
processIds.append(process.pid)
print(processIds[0])
#Command that doesn't return by itself
process.stdout.read().decode("utf-8")
return;
def recordThread(command, timeOut):
thread = Thread(target=executeRecord, args=(command,))
thread.start()
thread.join(timeOut)
os.kill(processIds.pop(), signal.SIGINT)
return;
Starten Sie den Sub-Thread mit setDaemon(True).
def bootstrap(_filename):
mb = ModelBootstrap(filename=_filename) # Has many Daemon threads. All get stopped automatically when main thread is stopped.
t = threading.Thread(target=bootstrap,args=('models.conf',))
t.setDaemon(False)
while True:
t.start()
time.sleep(10) # I am just allowing the sub-thread to run for 10 sec. You can listen on an event to stop execution.
print('Thread stopped')
break