并行执行类方法

并行执行类方法,第1张

并行执行类方法

当您调用

obj.method
进程时,子进程将获得中每个实例变量的单独副本
obj
。因此,您在子代中对它们所做的更改不会反映在父代中。您需要通过将更改的值显式地传递给父
multiprocessing.Queue
级,以使更改对父级生效:

from multiprocessing import Process, Queueq1 = Queue()q2 = Queue()pr1 = Process(target=t1.method, args=(q1,))pr2 = Process(target=t2.method, args=(q2,))pr1.start()pr2.start()out1 = q1.get()out2 = q2.get()t1.blah = out1t2.blah = out2pr1.join()pr2.join()

其他选择是使实例变量成为更改

multiprocessing.Value
实例或实例所需要的。这样,您在子级中所做的更改
自动反映在父级中。但这是以增加使用父代变量的开销为代价的。
multiprocessing.Manager

Proxy
__

这是使用的示例

multiprocessing.Manager
。这不起作用:

import multiprocessingclass Test(object) :    def __init__(self):       self.some_list = []  # Normal list    def method(self):        self.some_list.append(123)  # This change gets lostif __name__ == "__main__":    t1 = Test()    t2 = Test()    pr1 = multiprocessing.Process(target=t1.method)    pr2 = multiprocessing.Process(target=t2.method)    pr1.start()    pr2.start()    pr1.join()    pr2.join()    print(t1.some_list)    print(t2.some_list)

输出:

[][]

这有效:

import multiprocessingclass Test(object) :    def __init__(self):       self.manager = multiprocessing.Manager()       self.some_list = self.manager.list()  # Shared Proxy to a list    def method(self):        self.some_list.append(123) # This change won't be lostif __name__ == "__main__":    t1 = Test()    t2 = Test()    pr1 = multiprocessing.Process(target=t1.method)    pr2 = multiprocessing.Process(target=t2.method)    pr1.start()    pr2.start()    pr1.join()    pr2.join()    print(t1.some_list)    print(t2.some_list)

输出:

[123][123]

只需记住,a会

multiprocessing.Manager
启动一个子进程来管理您创建的所有共享实例,并且每次访问一个
Proxy
实例时,您实际上是在对该
Manager
进程进行IPC调用。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5648749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存