部分代码:
p1 = Process(target1, args1)
p2 = Process(target2, args2)
p1.start()
p2.start()
p1.join()
p2.join()
很有可能任何进程都会被中断;因此,我不应该按顺序加入,因为加入是一个阻止调用。
请帮忙。
答案 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
。