超时结果,如果没有 returns 来自已启动的进程 - Python

Timeout result if nothing returns from started process - Python

functionB 开始 functionA。我怎么能说如果没有结果来自 假设从 functionB 开始运行 5 秒 return "Nothing returned" 并终止 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)

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

但是如果你需要关闭一个运行进程。两个最简单的选择是: 使用 multiprocessing.Event 启动 functionA,如果设置了事件,则将其关闭。

否则你可以使用一个信号(这可以通过 Process().terminate 访问)——在你这样做之前你可能应该阅读以下内容: https://docs.python.org/3.4/librar/multiprocessing.html#multiprocessing.Process

特别是:

Warning If this method is used when the associated process is using a pipe or queue then the pipe or queue is liable to become corrupted and may become unusable by other process. Similarly, if the process has acquired a lock or semaphore etc. then terminating it is liable to cause other processes to deadlock.

Queue class 有超时,我建议使用:

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() 启动一个新的 process,而不是 thread,因此您应该适当地命名您的变量。
  2. 在您的代码中,您没有准确显示您打算如何从第二个进程中检索或使用 return 值。据我所知,无法检索 multiprocessing.Process() 的 return 值。此队列实现将允许您获取值。