如何检查子进程是否已完成?

时间:2018-01-24 11:29:26

标签: python python-3.x

我正在开始一个过程:

for i in range(1, processes + 1):
            hup = MyURLParser() //A class I made
            p = Process(target = hup.run)
            p.start()

之后,以便主线程不会立即退出:

 while (True):
        print("Main sleeping...")
        sleep(20)

如何检查每个子进程是否仍然从主线程运行,而不是这样做?然后,我没有无限循环,而是可以在正确的时间突破循环并做其他事情....

4 个答案:

答案 0 :(得分:3)

将所有流程添加到列表中,并依次为join()每个流程添加:

processes = []
for i in range(1, processes + 1):
    hup = MyURLParser() //A class I made
    p = Process(target = hup.run)
    p.start()
    processes.append(p)

for p in processes:
    p.join()

join()调用阻塞,直到该过程完成。你称之为顺序无关紧要;在已完成的流程上调用join()将立即返回。

您可能还想查看multiprocessing module中的其他功能;特别是Pool类可以帮助您简化此代码。

答案 1 :(得分:2)

p.is_alive()告诉您进程是否正在运行。

要等到它结束,请使用p.join()

答案 2 :(得分:1)

您可以使用join方法(在docs中阅读更多内容):

首先,保留您创建的Process个对象:

your_processes = []
...
   p.start()
   your_processes.append(p)

启动所有进程后,使用join等待每个进程完成执行。

for p in your_processes:
    p.join()
... #the rest of your code

基本上join使主进程等待进程p完成,然后才进入下一行代码。

答案 3 :(得分:1)

你可以这样做:

P = []
for i in range(1, processes + 1):
            hup = MyURLParser() //A class I made
            p = Process(target = hup.run)
            p.start()
            P.append(p)

for p in P:
            p.join()

要仅检查进程是否处于活动状态,请使用.is_alive()

在此处阅读更多内容:https://docs.python.org/3/library/multiprocessing.html