python - 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() 是告诉程序在结束程序之前等待这个线程/进程完成。有人能告诉我为什么会这样吗?
解决方案
但据我了解, 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
再次尝试之前的其他内容。
推荐阅读
- java - 您已经加载了库 /tmp/... 这可能禁用了堆栈保护
- python-3.x - python3中的余弦相似度
- java - 单击主页按钮时,Android应用程序未按预期最小化
- modal-dialog - 在显示模式(基础)中显示具有多个标记的地图
- javascript - 当我点击动态按钮时的动态模式
- blockchain - 用户如何签署多重签名交易?
- java - Android MVP - 分享偏好
- django-rest-framework - Django REST 框架 FileField PUT 测试用例
- postgresql - 无法访问 postgres PSQL
- sql - 检查表中是否存在多个值