2017-05-22 8 views
1

Ich habe einen Thread, der maximal 3 Minuten ausführen sollte. Wenn es 3 Minuten überschreitet, muss ich es töten. Mein derzeitiges Code-Snippet ist unten angegeben. Bitte beachten Sie, dass ich das Multiprocessing-Modul in Python nicht verwenden kann.Führen Sie einen Thread für bestimmte Zeit in Python

def test_th(): 
     p = threading.Thread(target=update_fm,name="update_fm", args=(url,)) 
     p.start() 
     p.join(180) 
     log.debug("isalive :",p.isAlive()) 

def update_fm(fv_path): 
    output = None 
    try: 
     output = subprocess.check_output('wget {0} -O /tmp/test_fm'.format(fv_path), stderr=subprocess.STDOUT, shell=True) 
    except: 
     log.error("Error while downloading package, please try again") 
     return FAIL 
    if output: 
     log.info('going to upgrade cool :)') 
     return SUCCESS 
    return FAIL 
+0

Also, was funktioniert nicht? –

+0

@ HoriaComan es ist nicht nach 3 Minuten beenden. Ich muss den Faden stoppen. – Arun

Antwort

1

Da der Thread ein Befehl ausgeführt wird, können Sie es nicht leicht stoppen (Is there any way to kill a Thread in Python?)

ABER Sie den Faden anmutig den Prozess durch das Töten beenden helfen kann, zu dem Thread ausgeführt wird fortgesetzt (und beendet) :

  • check_output durch ersetzen Popen
  • den Griff Popen und stellen sie sicher, dass es global
  • nach den 3 Minuten, töten den Griff: der Faden

wir vereinfachen verlässt sie mit einem eigenständigen Beispiel (Fenster, ersetzen notepad durch eine andere blockierende Material auf anderen Plattformen):

import threading,subprocess 

handle = None 

def update_fm(): 
    global handle 
    output = None 
    handle = subprocess.Popen('notepad',stdout=subprocess.PIPE) 
    output = handle.stdout.read() 
    rc = handle.wait() # at this point, if process is killed, the thread exits with 
    print(rc) 

def test_th(): 
     p = threading.Thread(target=update_fm) 
     p.start() 
     p.join(10) 
     if handle: 
      handle.terminate() 

test_th() 

Wenn Sie das Notepad-Fenster vor dem Timeout schließen, erhalten Sie den Rückgabecode 0, und wenn Sie 10 Sekunden warten, erhalten Sie den Rückgabecode 1.

Die Schwierigkeit in Ihrer Fehlerbehandlung wird von erzählen "Prozess getötet" und "ap Plikationsfehler ". Sie können ein anderes Flag setzen, wenn der Prozess beendet wird, um den Unterschied zu machen.

Verwandte Themen