在python中运行一段时间的线程

时间:2017-05-22 08:07:02

标签: python multithreading

我有一个应该执行最多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

1 个答案:

答案 0 :(得分:1)

由于线程正在运行命令,因此无法轻松停止(Is there any way to kill a Thread in Python?

但是你可以通过杀死正在执行的进程继续(并退出)来帮助线程正常退出:

  • check_output替换为Popen
  • 获取Popen的句柄,并确保它是全局的
  • 3分钟后,杀死句柄:线程退出

让我们使用一个独立的示例(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。

错误处理的难点在于从“进程被杀”和“应用程序错误”来判断。你可以在杀死进程时设置另一个标志以产生差异。