如何使用 ProcessPool 在进程之间有效地共享字典和列表
How to efficiently share dicts and lists between processes using ProcessPool
让我们考虑以下示例:
from pathos.pools import ProcessPool
class A:
def run(self, arg: int):
my_list = list(...)
my_dict = dict(...)
def __run_parallel(arg: int):
local_variable = 42
# some code and read access...
read_only1 = my_list[...]
read_only2 = dict[...]
# some code and write access...
my_list.append(arg)
my_dict[arg] = local_variable
ProcessPool(4).map(__run_parallel, range(1000))
因为似乎 list
和 dict
都不是线程安全的,所以我正在寻找一种方法 有效地 共享对这些变量的访问到池中的所有进程。
到目前为止,我已尝试使用 pa.helpers.mp.Manager
将 my_list
和 my_dict
作为附加参数传递给 __run_parallel
。然而,即使它有效,它也非常慢(因为它显然是为分布式系统构建的)。
由于我现在在多个晚上的试错环节中研究这个问题,我想问问是否有人知道如何高效使用共享 [= __run_parallel
中的 12=] 和 list
使用 pathos
.
按照@Mike McKerns 的建议,将 list
和 dict
变量都转换为 pathos.helpers.mp.Array
而没有中间变量 pa.helpers.mp.Manager
带来了预期的性能提升。
让我们考虑以下示例:
from pathos.pools import ProcessPool
class A:
def run(self, arg: int):
my_list = list(...)
my_dict = dict(...)
def __run_parallel(arg: int):
local_variable = 42
# some code and read access...
read_only1 = my_list[...]
read_only2 = dict[...]
# some code and write access...
my_list.append(arg)
my_dict[arg] = local_variable
ProcessPool(4).map(__run_parallel, range(1000))
因为似乎 list
和 dict
都不是线程安全的,所以我正在寻找一种方法 有效地 共享对这些变量的访问到池中的所有进程。
到目前为止,我已尝试使用 pa.helpers.mp.Manager
将 my_list
和 my_dict
作为附加参数传递给 __run_parallel
。然而,即使它有效,它也非常慢(因为它显然是为分布式系统构建的)。
由于我现在在多个晚上的试错环节中研究这个问题,我想问问是否有人知道如何高效使用共享 [= __run_parallel
中的 12=] 和 list
使用 pathos
.
按照@Mike McKerns 的建议,将 list
和 dict
变量都转换为 pathos.helpers.mp.Array
而没有中间变量 pa.helpers.mp.Manager
带来了预期的性能提升。