如果没有从启动进程返回任何结果,则超时结果 - Python

时间:2015-02-04 18:02:35

标签: python multithreading multiprocessing

functionB启动functionA。如果没有结果可以回复,怎么说呢 函数让我们说5秒从functionB返回“Nothing return”并杀死functionA进程

def functionA():
    value1 = open()
    if (value1 != None):
        value2 = testcolor()
        return value2
    else:
        value3 = close()
        return value3


def functionB():
    thread = multiprocessing.Process(name='send_daemon%d', target=functionA)
    thread.daemon = True
    thread.start()
    res = {'status': 'started' ,}
    return json.dumps(res)

2 个答案:

答案 0 :(得分:0)

在你的情况下,当函数a结束时 - 它只会自行停止,不需要再做任何事情了。

但是如果你需要关闭正在运行的进程。两个最简单的选择是: 使用multiprocessing.Event启动functionA,并在设置事件时关闭它。

否则你可以使用一个信号(这是可访问的Process().terminate) - 在你这样做之前你应该读一下: https://docs.python.org/3.4/librar/multiprocessing.html#multiprocessing.Process

特别是:

  

警告   如果在关联进程使用管道或时使用此方法   队列然后管道或队列可能会被破坏,并可能   被其他过程变得无法使用。同样,如果过程有   获得锁定或信号量等,然后终止它是负责任的   导致其他进程陷入僵局。

答案 1 :(得分:0)

Queue类有一个超时,我建议使用它:

import multiprocessing
import Queue

def functionA(return_queue):
    value1 = open()
    if (value1 != None):
        value2 = testcolor()
        return_queue.put(value2)
    else:
        value3 = close()
        return_queue.put(value3)


def functionB():

    return_queue = multiprocessing.Manager().Queue()

    proc = multiprocessing.Process(
        name='send_daemon%d', target=functionA, args=(return_queue,))
    proc.daemon = True
    proc.start()
    res = {'status': 'started' ,}

    try:
        # wait for two seconds for the function to return a value
        return_value = return_queue.get(timeout=2)
    except Queue.Empty:
        proc.terminate()
        return_value = None

    # do something with the return value here

    return json.dumps(res)

注意:

  1. 不要将多处理库与线程库混淆。 multiprocessing.Process()启动新的进程,而不是线程,因此您应该适当地命名变量。
  2. 在您的代码中,您没有准确显示您打算如何检索或使用第二个进程的返回值。据我所知,无法检索multiprocessing.Process()的返回值。此队列实现将允许您获取值。