当您调用
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调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)