Python多进程中未传递Queue导致父子进程数据交互失败问题
Python多进程父子进程Queue数据无法获取的问题解决
问题根源
- 子进程未接收正确的Queue实例:创建
Process时,没有将父进程的Queue作为参数传递给目标函数getretsults,导致子进程无法拿到用于跨进程通信的Queue,甚至会触发索引越界错误。 - 多进程内存空间隔离:全局声明的
Queue不会在父子进程间共享,每个进程拥有独立的内存空间,全局变量在子进程中是独立副本,无法实现数据传递。
修正后的代码
from multiprocessing import Process, Queue def getretsults(data, q): print("Executing Get Results..........") res = [i**i for i in data] print(f"{id(q) = }") q.put(res) def main_process(): print("Executing Main Process.........") args = [ range(1,6), range(6,11), range(11,16) ] process_ = [] q = Queue() for x in args: # 将Queue作为参数传递给子进程 p = Process(target=getretsults, args=(x, q)) process_.append(p) p.start() for x_ in process_: x_.join() # 获取所有子进程的计算结果 for _ in range(len(args)): print(q.get()) if __name__ == '__main__': main_process()
关键改动说明
- 简化目标函数参数:将
getretsults的参数改为明确的data和q,避免*kwargs带来的索引逻辑混乱,代码可读性更强。 - 传递Queue实例:创建子进程时,将父进程的
q作为参数传入args,确保子进程拿到的是用于跨进程通信的同一个Queue实例(底层通过管道实现数据同步)。 - 规范代码结构:将
if __name__ == '__main__':放在最外层,符合Python多进程编程规范,避免子进程重复执行初始化逻辑。 - 完整获取结果:因3个子进程各向Queue存入一组数据,循环调用
q.get()三次,确保所有结果都被取出,避免单一次get()导致的不完整输出或阻塞。
多进程Queue使用注意事项
- 必须通过参数传递Queue实例,不能依赖全局变量实现跨进程数据传递。
- 调用
q.get()时,若Queue为空会触发阻塞,需确保所有子进程完成put()操作后再调用,或通过q.get(timeout=...)设置超时时间避免无限等待。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

