使用Python多处理来运行对象计算



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

我目前正在使用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

下面是我使用队列的解决方案:

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

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

最新更新