我尝试使用它的方法更改一个类字段,但是当该方法投入使用时,它无法正常工作。
来自多处理导入过程
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.这怎么可能?
答案 0 :(得分:9)
首先,您要使用join
,等待进程完成后再继续执行其余代码。
其次,当您使用multiprocess
时,它会为每个M
创建一个Process
的新实例。在self
loop
时,您可以看到此信息
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
答案 1 :(得分:1)
问题可能是由于当你检查M.x
的值时,在循环实际运行之前它是(由于多处理的并行特性)。尝试在loop()
内放置一个打印语句,在p.start()
后放一个打印语句,打印出M.x
。看哪个先打印。它可能是M.x
。
答案 2 :(得分:0)
from multiprocessing import Process
class Multi:
def __init__(self):
self.x = 20
def loop(self):
for i in range(1,100):
self.x = i
print self.x
M = Multi()
p = Process(target=M.loop, args = ())
p.start()
这是循环方法中包含print语句的代码。