我有一个应该执行最多3分钟的线程。如果它超过3分钟我需要杀死它。我现在的代码片段如下所示。请注意我不能在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 :(得分:1)
由于线程正在运行命令,因此无法轻松停止(Is there any way to kill a Thread in Python?)
但是你可以通过杀死正在执行的进程继续(并退出)来帮助线程正常退出:
check_output
替换为Popen
Popen
的句柄,并确保它是全局的让我们使用一个独立的示例(windows,在其他平台上用其他阻塞内容替换notepad
)来简化它:
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()
在这里,如果你在超时之前关闭记事本窗口,你会得到返回代码0,如果你等了10秒,这个过程就会被杀死,你得到返回码1。
错误处理的难点在于从“进程被杀”和“应用程序错误”来判断。你可以在杀死进程时设置另一个标志以产生差异。