Python 多处理类方法

标签 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

关于Python 多处理类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311398/

相关文章:

python - 带有居中标签的堆积条形图

python - Pandas 在关联的字符串值处将列添加到新数据框?

Python多处理池: Why doesn't adding additional processes seem to improve performance on a hyperthreaded system?

python - 提交代码以执行到 concurrent.futures.ProcessPool 中的所有进程

python - 基本并行化。创建一个工作人员池,所有工作人员并行运行相同的功能

Python(多处理): How to pass a dictionary as the argument of a worker process initializer function?

python - Flask-Admin 中字段的自定义名称

python - NLTK:摆脱括号和后置标签

Python 快速 DataFrame 连接

python - 尝试访问 multiprocessing.Pool 工作进程中的持久数据时出现不稳定的运行时异常