python多处理子进程阻塞父进程

2024-06-18 11:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

代码:

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()是告诉程序在结束程序之前等待该线程/进程完成。 有人能告诉我为什么会这样吗


Tags: import程序true示例iftime进程资源
2条回答

p.join()不是用于结束程序,而是用于等待子进程完成。如果需要结束程序,请使用sys.exit(0)或raise SystemExit(“此处的原因”)之类的命令

But from my understanding, p.join() is to tell the program to wait for this thread/process to finish before ending the program.

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

最好将您创建的所有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之前执行其他操作

相关问题 更多 >