Python多处理类方法
问题描述
我正在尝试使用类字段的方法更改它,但将该方法放入它时不起作用。
来自多处理导入流程
class Multi:
def __init__(self):
self.x = 20
def loop(self,):
for i in range(1,100):
self.x = i
M = Multi()
p = Process(target=M.loop)
p.start()
运行此程序后,M.x仍为20。这怎么可能?
解决方案
首先,您希望使用join
,它将等待进程完成,然后再继续执行其余代码。
multiprocess
时,它会为每个Process
创建一个新的M
实例。在loop
中打印self
时可以看到这一点
class Multi:
def __init__(self):
self.x = 20
def loop(self):
print(self, 'loop')
for i in range(1, 100):
self.x = i
if __name__ == '__main__':
M = Multi()
print(M, 'main 1')
p = Process(target=M.loop)
p.start()
p.join()
print(M, 'main 2')
>>> <__main__.Multi object at 0x000001E19015CCC0> main 1
>>> <__mp_main__.Multi object at 0x00000246B3614E10> loop
>>> <__main__.Multi object at 0x000001E19015CCC0> main 2
因此,x
的值永远不会在原始类中更新。
from multiprocessing import Process, Value
class Multi:
def __init__(self):
self.x = Value('i', 20)
def loop(self):
for i in range(1, 100):
self.x.value = i
if __name__ == '__main__':
M = Multi()
p = Process(target=M.loop)
p.start()
p.join()
print(int(M.x.value))
>> 99
相关文章