python - 当通过管道传递大型数组时,Python 多处理卡住了
问题描述
我在python中使用多处理并尝试通过管道将一个大的numpy数组传递给一个子进程。它适用于小数组,但会挂起较大的数组而不会返回错误。
我相信管道被阻塞并且已经阅读了一些关于它但无法弄清楚如何解决问题的方法。
def f2(conn, x):
conn.start()
data = conn.recv()
conn.join()
print(data)
do_something(x)
conn.close()
if __name__ == '__main__':
data_input = read_data() # large numpy array
parent_conn, child_conn = Pipe()
p = multiprocessing.Pool(processes=8)
func = partial(f2, child_conn)
parent_conn.send(data_input)
parent_conn.close()
result = p.map(func, processes)
p.close()
p.join()
解决方案
忽略此代码中的所有其他问题(您没有x
传递给map
,您不使用接收x
f2
,混合通常是错误的做法),您的最终问题是在工作人员之前执行的阻塞调用进程可以从中读取。Pool.map
Pipe
send
假设您真的想与 混合map
,Pipe
解决方案是在开始之前map
异步启动 ,因此在父尝试写入时从另一侧读取一些内容:send
Pipe
if __name__ == '__main__':
data_input = read_data() # large numpy array
parent_conn, child_conn = Pipe()
# Use with to avoid needing to explicitly close/join
with multiprocessing.Pool(processes=8) as p:
func = partial(f2, child_conn)
# Launch async map to ensure workers are running
future = p.map_async(func, x)
# Can perform blocking send as workers will consume as you send
parent_conn.send(data_input)
parent_conn.close()
# Now you can wait on the map to complete
result = future.get()
如前所述,由于 的问题,此代码不会运行x
,即使它运行了,Pipe
文档也明确警告不应同时读取两个不同的进程Pipe
。
如果您想在单个工作人员中批量处理数据,您只需使用Process
and Pipe
,例如:
def f2(conn):
data = conn.recv()
conn.close()
print(data)
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
proc = multiprocessing.Process(target=f2, args=(child_conn,))
proc.start()
data_input = read_data() # large numpy array
parent_conn.send(data_input)
parent_conn.close()
proc.join()
如果您想跨多个工作人员分别处理每个元素,您只需使用Pool
and map
:
def f2(x):
print(x)
if __name__ == '__main__':
data_input = read_data() # large numpy array
with multiprocessing.Pool(processes=8) as p:
result = p.map(f2, data_input)
推荐阅读
- mysql - 在 MySQL 中获取过去 6 个月的数据
- r - 显示两个向量差异的条形图
- swift - 提高长组合链的编译时间
- visual-studio - 如何找到哪个版本的 Visual Studio 提供 devenv.dll 14.2 版本?
- electron - electron-builder dist 文件夹中的安装程序和 win-unpacked 文件夹有什么区别?
- python - MongDB 通过顶级属性和嵌套数组键查找文档,并返回部分匹配的文档
- d3.js - d3.js - 移动组元素并保持链接连接
- c# - c# EF Core 3 和子查询更新 16k 行太慢
- visual-studio - 如何使用 XAML 按钮将表达式输入到 NumberBox 对象中?(C++/XAML)
- java - 并行请求在 JPA 中生成插入而不是更新