python - 在多处理期间共享大型任意数据结构
问题描述
我想在 python 中并行化一个需要对几个大型非数组数据结构进行读取访问的进程。在不将所有大型数据结构复制到每个新进程中的情况下,推荐的方法是什么?
谢谢
解决方案
multiprocessing 包提供了两种共享状态的方式:共享内存对象和服务器进程管理器。您应该使用服务器进程管理器,因为它们支持任意对象类型。
以下程序使用服务器进程管理器:
#!/usr/bin/env python3
from multiprocessing import Process, Manager
# Simple data structure
class DataStruct:
data_id = None
data_str = None
def __init__(self, data_id, data_str):
self.data_id = data_id
self.data_str = data_str
def __str__(self):
return f"{self.data_str} has ID {self.data_id}"
def __repr__(self):
return f"({self.data_id}, {self.data_str})"
def set_data_id(self, data_id):
self.data_id = data_id
def set_data_str(self, data_str):
self.data_str = data_str
def get_data_id(self):
return self.data_id
def get_data_str(self):
return self.data_str
# Create function to manipulate data
def manipulate_data_structs(data_structs, find_str):
for ds in data_structs:
if ds.get_data_str() == find_str:
print(ds)
# Create manager context, modify the data
with Manager() as manager:
# List of DataStruct objects
l = manager.list([
DataStruct(32, "Andrea"),
DataStruct(45, "Bill"),
DataStruct(21, "Claire"),
])
# Processes that look for DataStructs with a given String
procs = [
Process(target = manipulate_data_structs, args = (l, "Andrea")),
Process(target = manipulate_data_structs, args = (l, "Claire")),
Process(target = manipulate_data_structs, args = (l, "David")),
]
for proc in procs:
proc.start()
for proc in procs:
proc.join()
有关更多信息,请参阅文档中的进程之间共享状态。
推荐阅读
- python - pandas:在组内使用条件进行迭代
- c# - 如何在 ASP.NET Core 重写模块中使用 {PATH_INFO}?
- android - Angular/Cordova 应用程序 html5 视频标签无法在 Android 上播放
- dependencies - 如何在理解中一次创建多个蝴蝶图?
- python - Freeze 方法在 Frozen Flask 中遇到文件存在错误
- r - Shiny Leaflet R 无法正确更改圆形标记的颜色
- spring - 在 Spring Boot 中加载 chromedriver
- node.js - Heroku postgres 爱好基本内存限制
- tfs - MSTest failed to publish test result with error 此时无法启动异步操作
- c - “控件可能到达非无效函数的末尾”错误消息