Python多处理类方法

2022-04-10 00:00:00 python python-multiprocessing

问题描述

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

来自多处理导入流程

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

相关文章