使用“pathos.pools.ProcessPool”锁定的规范方法是啥?

Posted

技术标签:

【中文标题】使用“pathos.pools.ProcessPool”锁定的规范方法是啥?【英文标题】:What is the canonical way to use locking with `pathos.pools.ProcessPool`?使用“pathos.pools.ProcessPool”锁定的规范方法是什么? 【发布时间】:2020-10-24 21:44:06 【问题描述】:

让我们考虑以下示例:

from pathos.pools import ProcessPool

class A:
    def run(self, arg: int):

        shared_variable = 100
        
        def __run_parallel(arg: int):
            local_variable = 0

            # ...

            if local_variable > shared_variable:
              shared_variable = local_variable

        ProcessPool(4).map(__run_parallel, range(1000))

很明显,当使用四个进程时,if local_variable > shared_variable:shared_variable = local_variable 存在数据竞争。

因此,我想在if 块周围引入一个锁定机制,所以我尝试了以下方法:

from pathos.pools import ProcessPool
from multiprocessing import Lock

class A:
    def run(self, arg: int):

        lock = Lock()
        shared_variable = 100
        
        def __run_parallel(arg: int):
            local_variable = 0

            # ...

            lock.acquire()
            if local_variable > shared_variable:
              shared_variable = local_variable
            lock.release()

        ProcessPool(4).map(__run_parallel, range(1000))

但是,我收到错误 RuntimeError: Lock objects should only be shared between processes through inheritance

multiprocessing 库中,似乎实现所需互斥的规范方法是使用Manager 对象。

但是,如何在 pathos 中惯用地执行此操作?

【问题讨论】:

【参考方案1】:

pathos利用multiprocess,它与multiprocessing具有相同的接口,但使用dill。您可以通过以下任何一种方式访问​​它。

>>> import pathos as pa
>>> import multiprocess as mp
>>> mp.Manager is pa.helpers.mp.Manager
True

【讨论】:

以上是关于使用“pathos.pools.ProcessPool”锁定的规范方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)