如何将不可挑选的变量传递到多处理池?

问题描述 投票:0回答:1

我已经搜索了好几天,但我不知道如何将 unpickleable 变量传递到多处理池。还可能吗?

我是多处理新手,我可能会错过一些概念。然而,我尝试在我的案例中重现一些基本示例,其中我尝试并行提取 Abaqus 结果文件。为了使提取工作正常进行,我需要向每个工作人员传递一个“步骤”对象,即不可picklable Abaqus 对象,以及打开用于写入的 zip 文件。我尝试过使用多处理库的几个函数,但看起来这个 pickling 对我来说是一个阻碍。

我面临的另一个限制是使用 Python 2。事实上,我必须使用 Abaqus 中嵌入的 Python 发行版,而他们仅在我尚未使用的最新版本中才切换到 Python 3。

有人可以分享一个带有不可挑选变量的 multiprocessing.Pool 示例吗?如果有另一个允许我在我的情况下并行化工作人员的库,我不在乎坚持使用多处理库。请记住,我无法修改 Abaqus 中的 Python 发行版,并且我可能无法访问外来库......

python-2.7 multiprocessing pool
1个回答
0
投票

尝试确定使用并发(在您的情况下是多处理)时并发工作人员之间严格需要共享的内容。一般来说,您希望避免在并发工作线程之间共享可变状态(例如可写文件),因为这需要您这边进行特殊的锁定和同步。

尝试仅在已处理数据和线程之间共享只读数据,并让它们返回已处理数据,而不是改变共享状态。然后,您可以在一个线程/进程(例如主进程)上收集并发工作人员的聚合结果,并将它们非并发地写入文件。

如果某些数据是不可挑选的,这意味着在没有更多思考的情况下,对该值进行多重处理可能是错误的。

您可以发布一个最低限度可重现的示例,以便我们可以查看您当前的代码并为您提供更多帮助。

© www.soinside.com 2019 - 2024. All rights reserved.