如何在第一个进程仍在运行时加入已退出的第二个进程?

时间:2017-06-11 14:51:20

标签: python-2.7 python-multiprocessing

部分代码:

p1 = Process(target1, args1)
p2 = Process(target2, args2)

p1.start()
p2.start()

p1.join()
p2.join()

很有可能任何进程都会被中断;因此,我不应该按顺序加入,因为加入是一个阻止调用。

请帮忙。

1 个答案:

答案 0 :(得分:1)

这取决于您的意图 - 当您想要等待所选流程完成时使用Process.join()(因此它会加入'回到主流程),但您可以随时查看循环中的过程状态,而不是在第二次完成之前等待一个完成。

我建议使用multiprocessing.Event并将其传递给您的进程,然后您的进程可以在退出时设置标志,并且您可以在主进程中执行事件循环,等待该事件确定该过程退出了。您也可以使用相同的系统来订购流程。

如果你想要的只是确定进程何时结束而不等待前一个进程,你也可以循环遍历你的进程,timeout设置为Process.join(),如下所示:

import multiprocessing
import time

def target(name, timeout=5):
    print("{} started...".format(name))
    time.sleep(timeout)
    print("{} finishing...".format(name))

# define a process list for convenience with initialization/shutdown:
processes = {
    "P1": {"target": target, "args": ["P1", 5]},
    "P2": {"target": target, "args": ["P2", 3]},
    "P3": {"target": target, "args": ["P3", 8]},
    "P4": {"target": target, "args": ["P4", 1]},
}

if __name__ == "__main__":   # cross-platform multiprocessing guard
    # initialize and start our processes:
    for name, kwargs in processes.items():  # loop through the process list
        print("Initializing: {}...".format(name))
        processes[name] = multiprocessing.Process(**kwargs)
        print("Starting: {}...".format(name))
        processes[name].start()

    # when its time to exit...
    processes = processes.items()  # easier to manage as a list of tuples
    while processes:  # loop for as long as we have alive processes...
        name, process = processes.pop(0)  # remove the first element from our process list
        process.join(0.1)  # trying to join the current process, wait for 100ms
        if process.is_alive():  # Process still alive, moving to the next one...
            processes.append((name, process))  # add it to the back of the queue
        else:
            print("{} ended!".format(name))
    print("Woo-hoo! All processes exited...")

注意:这可以在不要求加入'在这种情况下你的子进程到主进程,但是如果你的子进程在没有调用join的情况下等待任务(基本上是wait()),它将永远不会关闭。但是,再次,这就是为什么你想在第一种情况下使用multiprocessing.Event