Python多处理类方法 [英] Python multiprocessing class methods

查看:15
本文介绍了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的值永远不会在原始类中更新。

幸运的是,有一个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多处理类方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆