Ich muss Thread beenden, kann aber nicht regelmäßig alle Flags überprüfen, da es auf Lesen/Eingabe wartet.Kill Python Thread, während es lange auf Lesen wartet
Einfaches Beispiel:
import threading, time
class Test(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print(input("wainting for input: "))
th = Test()
th.start()
time.sleep(5)
print("killing!")
th.join(5)
print(th.is_alive())
Das reale Beispiel ist dies (Thread töten, wenn es hängt - keine Ausgabe für längere Zeit):
import threading, time
class Test(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def call(args):
return subprocess.Popen(" ".join(args), shell=True, stderr=subprocess.PIPE)
def run(self):
mainProcess = call([ any program that could hang])
out = None
while mainProcess.returncode != 0 or out == '' and mainProcess.poll() != None:
out = mainProcess.stderr.read(1)
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
th = Test()
th.start()
time.sleep(5)
print("killing!")
th.join(5)
print(th.is_alive())
Wenn es ein besserer Ansatz ist, würde ich Sei auch glücklich.
es lesen sollte 'subprocess.Popen (args, stderr = subprocess.PIPE)'. 'Call' ist keine Methode. – Daniel
Sie möchten also ein Lese-Timeout? Setzen Sie das Lesen mit einem 'select()' oder 'poll()' mit Timeout voran. – dhke