我正在尝试使用它的方法更改类字段,但是当将方法放入其中时它不起作用。
从多处理导入过程
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
的值在原始类中永远不会更新。
幸运的是,有一个Value您可以使用的对象来处理这个。这将创建一个可以通过进程修改的共享内存对象
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
关于Python 多处理类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311398/