Python多处理类方法

时间:2017-07-25 18:50:15

标签: 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.这怎么可能?

3 个答案:

答案 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语句的代码。