0

我需要运行一些计算来更新对象属性。我想使用并行计算,因为我需要更新多个对象的属性,也就是说,我有多个对象,我需要对每个对象进行相同的计算。对象之间不共享信息。

我目前正在使用具有map或类似功能的进程池,问题是这些进程复制对象,然后进行计算,而不是直接使用原始对象进行计算。有没有办法解决?

举个例子:

from multiprocessing import Pool

class A:

    def __init__(self, init):
        self.a = init

    def func(self, b):
        self.a = self.a + b

foo = A(2)
print(foo.a) # prints 2

p = Pool()
result = p.map(foo.func, (3,))
print(foo.a) #prints 2, should print 5

foo.func(3)
print(foo.a) #prints 5 as expected
4

1 回答 1

0

这是我使用队列的解决方法:

from multiprocessing import Process, Queue
import time

class A:
    def __init__(self, init):
        self.a = init

    def func(self, b):
        self.a = self.a + b

    def par_func(self, q, b):
        print('starting')
        self.func(b)
        q.put(self.a)
        time.sleep(10)
        print('whew! all done')

foo = A(2)
bar = A(6)
print('initial:', foo.a, bar.a) # prints 2, 6

q1, q2 = Queue(), Queue()
p1, p2 = Process(target=foo.par_func, args=(q1, 3)), Process(target=bar.par_func, args=(q2, 4))
p1.start()
p2.start()
p1.join()
p2.join()

#prints from par_func() were nonsequential i.e. parallelism is occurring 

foo.a = q1.get()
bar.a = q2.get()

print('final:', foo.a, bar.a) # prints 5, 10

这可能远非理想,但它适用于我的目的。我把它留给其他有这个问题的人。

于 2021-01-28T17:54:32.820 回答