首页 > 解决方案 > python multiprocessing - 子进程阻塞父进程

问题描述

我正在尝试学习多处理,并创建了一个示例,但是它的行为出乎意料。父进程运行,然后创建一个子进程,但资源不会回到父进程,直到子进程完成。

代码:

from multiprocessing import Process
import time

def f():
    newTime = time.time() + 7
    while(time.time() < newTime):
        print("inside child process")
        time.sleep(int(5))

if __name__ == '__main__':
    bln = True
    while(True):
        newTime = time.time() + 4
        while(time.time() < newTime):
            print("printing fillers")
            if(bln):
                p = Process(target=f)
                p.start()
                p.join()
                bln = False

结果

“内部子进程”

(等待 5 秒)

“内部子进程”

“印刷填料”

“印刷填料”

[...]

如果我删除 'p.join()' 那么它将起作用。但据我了解, p.join() 是告诉程序在结束程序之前等待这个线程/进程完成。有人能告诉我为什么会这样吗?

标签: pythonmultiprocessing

解决方案


但据我了解, p.join() 是告诉程序在结束程序之前等待这个线程/进程完成。

不,它会立即阻塞主线程,直到线程/进程完成。通过在您开始流程后立即执行此操作,您不会让循环继续,直到每个流程完成。

最好将Process您创建的所有对象收集到一个列表中,以便在循环创建它们之后访问它们。然后在一个新的循环中,等待它们全部创建并启动后完成。

#for example
processes = []
for i in whatever:
    p = Process(target=foo)
    p.start()
    processes.append(p)
for p in processes:
    p.join()

如果您希望能够同时做一些事情(在等待时join),最常见的做法是使用另一个线程或进程。你也可以通过给它一个超时值来选择只等待很短的时间join,如果这个过程在这段时间内没有完成,就会抛出一个异常,你可以用一个try块来捕获它,然后决定去做在尝试join再次尝试之前的其他内容。


推荐阅读