并行化在条件下更改类属性的函数



如何并行化修改类属性的函数?在下面的示例中,change_arr()基于loc修改类的属性x的内容;它将-99分配给等于locx的每个元素。当我按照编写的方式运行此脚本时,我在两个打印中都得到了相同的数组(因此没有进行任何修改)。但是,如果我使用Pool注释该行并使用 for 循环取消注释执行相同工作的两行,我会得到[-3, -2, -1, 0, 1, 2, 3][-99, 2, -99, 0, -99, 2, -99],这就是我想要的。

那么,我的问题是,如何并行化函数的使用change_arr并行修改相同的类属性?

我知道可能有更好的方法来实现这一点。但是,该示例并不完全是我的代码(因为它更长,更复杂),而是一个最小示例。

import numpy as np
from multiprocessing import Pool

class MyClass:
def __init__(self) -> None:
self.x = np.array([-3, -2, -1, 0, 1, 2, 3])
def process(self):
Pool(2).map(self.change_arr, [-3, -1, 1, 3])
# for i in [-3, -1, 1, 3]:
#     self.change_arr(i)
def change_arr(self, loc):
self.x[self.x == loc] = -99


if __name__ == '__main__':
mc = MyClass()
print(mc.x)
mc.process()
print(mc.x)

您可以使用多处理在进程之间共享内存。值和多处理。数组类型。我创建了一个最小的示例,它如何在不涉及 numpy 和类的情况下工作。

from multiprocessing import Pool, Array
def change_arr(loc):
for i in range(len(x)):
if loc == x[i]:
x[i] = -99

if __name__ == '__main__':
x = Array('i', [-3, -2, -1, 0, 1, 2, 3])
print([i for i in x])
Pool(2).map(change_arr, [-3, -1, 1, 3])
print([i for i in x])

我不确定它是否适用于 numpy 数组。从理论上讲,包装在数组或值中的对象可以是任何类型的。 诀窍是将 x 定义为全局变量,并将其绑定到 map 函数中使用的函数。

最新更新