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

4
我将通过以下步骤启动一个进程:

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个回答

5
将所有进程添加到列表中,然后依次使用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 模块中的其他功能。特别是 Pool 类可能会帮助简化此代码。

4

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

要等待进程结束,请使用p.join()


1

你可以使用 join 方法(在文档中了解更多):

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

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

在启动所有进程后,使用 join 等待它们执行完毕。

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

基本上,join 让主进程等待进程 p 完成,然后才继续执行下一行代码。

这种方法行不通,因为进程不共享本地或全局变量。 - Stephen
更多详细信息请查看此处: - Stephen
https://dev59.com/r1gQ5IYBdhLWcg3wnFPJ - Stephen

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接