gpt4 book ai didi

Python 多处理类方法

转载 作者:太空狗 更新时间:2023-10-30 00:34:24 26 4
gpt4 key购买 nike

我正在尝试使用它的方法更改类字段,但是当将方法放入其中时它不起作用。

从多处理导入过程

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com