python - Python多处理队列内存管理
问题描述
假设我有Main
进程和 2 个附加进程A
和B
. 在这个程序中,A 应该向 B 发送数据。如果我们有这样的代码:
from multiprocessing import Process, Queue
def process_a(iterable, q):
for x in iterable:
q.put(x)
def process_b(q):
while some_condition():
x = q.get()
iterable = some_iterable()
q = Queue()
pa = Process(target=process_a, args=(iterable, q))
pb = Process(target=process_b, args=(q,))
pa.start()
pb.start()
pa.join()
pb.join()
鉴于队列q
是在主进程中创建的,数据流是这样的吗?
A => Main => B
如果是这样,有没有办法Queue
初始化B
并传递给数据A
直接从A
跳过?B
Main
解决方案
鉴于队列 q 是在主进程中创建的,数据流是这样的吗?
A => Main => B
不,正如文档中所解释的, aQueue
只是围绕 a 的自动同步包装器Pipe
。当您将 a 传递Queue
给孩子时,您只是传递了那个Pipe
和一些锁。
这Pipe
只是操作系统管道的包装。当您将 a 传递Pipe
给孩子时,您只是在传递管道的文件描述符/句柄。
忽略锁,进程 A 基本上只是写入管道,进程 B 只是从中读取。
锁确实让事情变得更复杂了(也可能意味着进程 A 启动了一个隐藏的后台线程),但它们仍然根本不涉及主进程。
除非主进程调用队列上的方法,否则它与该队列完全无关。
推荐阅读
- python - 如何在散点图中使用轴上的字符串对值进行排序
- android - android studio 4.0 上的 Gradle 同步失败
- amazon-web-services - ec2 实例中的新卷未反映
- mongodb - 根据时间对多个集合进行查询和排序
- javascript - 在提交表单时进行表单验证时,组件没有在 React 中更新
- python - 带有 Python 3.7 的 VSCode 中的 AREPL 扩展错误
- reactjs - 映射静态查询中的项目不显示任何结果
- discord - 试图用不和谐机器人数数
- sql - AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或在聚合函数中使用
- flutter - 当互联网在颤动中禁用时获取我所在位置的纬度和经度