Python使用time.sleep时multiprocessing多进程不并行运行问题求解
问题根因
你之前猜测是time.sleep导致的串行执行,这个判断是错误的,问题完全出在Process对象的传参写法不符合规范:
- 你编写的
target=f('Tom')会直接在主进程中同步执行f('Tom')函数,等待函数执行完成(含10秒休眠)后,才会将函数的返回值(此处f无返回值,实际传的是None)赋值给target参数。相当于两次创建子进程前,已经在主进程串行执行了两次f函数,自然不会有并行效果。 - 代码还存在两个额外问题:
- 未导入
multiprocessing.Queue类,直接使用Queue()会触发名称错误 f函数中没有任何向队列写入数据的逻辑,后续调用l1.get()、l2.get()会永久阻塞,无法得到返回结果。
- 未导入
修复方案
修改传参逻辑:给Process传target参数时仅传入函数名,函数的入参通过args参数(元组类型)传递,同时补全队列写入逻辑和导入语句,修正后的代码如下:
from multiprocessing import Process, Queue import time def f(name, q): res = f'hello {name}' print(res) time.sleep(10) q.put(res) # 把执行结果写入队列供主进程获取 if __name__ == '__main__': # 上述判断是Windows系统下的强制要求,防止多进程启动时无限递归报错 l1 = Queue() a = Process(target=f, args=('Tom', l1)) a.start() l2 = Queue() b = Process(target=f, args=('Stock', l2)) b.start() print(l1.get()) print(l2.get())
修改后两个子进程会同时启动,总耗时约10秒即可完成全部执行,达到预期的并行效果。
内容的提问来源于stack exchange,提问作者Meenakshisundaram Ramanathan
相关产品推荐
相关产品推荐

