如何在python中使用多重处理将附加到类变量上?

时间:2019-11-06 23:05:11

标签: python multiprocessing python-3.7

我有一个程序,其中所有内容都构建在类对象中。有一个函数可以对另一个函数进行50次计算,每个函数都有不同的输入,因此我决定使用多重处理来加快速度。但是,最后需要返回的列表始终返回空。有任何想法吗?这是我的问题的简化版本。 main_function()的输出应为包含数字0-9的列表,但是该列表返回空。

class MyClass(object):
    def __init__(self):
        self.arr = list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        jobs = []

        for i in range(0,10):
            p = multiprocessing.Process(target=self.helper_function, args=(i,))
            jobs.append(p)
            p.start()

        for job in jobs:
            jobs.join()

        print(self.arr)

2 个答案:

答案 0 :(得分:6)

arr是一个list,不会在子流程实例之间共享。

为此,您必须使用Manager对象创建一个托管列表,该列表知道在进程之间共享该事实。

关键是:

self.arr = multiprocessing.Manager().list()

完整的工作示例:

import multiprocessing

class MyClass(object):
    def __init__(self):
        self.arr = multiprocessing.Manager().list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        jobs = []

        for i in range(0,10):
            p = multiprocessing.Process(target=self.helper_function, args=(i,))
            jobs.append(p)
            p.start()

        for job in jobs:
            job.join()

        print(self.arr)

if __name__ == "__main__":
    a = MyClass()
    a.main_function()

此代码现在显示:[7, 9, 2, 8, 6, 0, 4, 3, 1, 5]

答案 1 :(得分:0)

多重处理是敏感的。

对于简单的多处理任务,我建议:

from multiprocessing.dummy import Pool as ThreadPool


class MyClass(object):
    def __init__(self):
        self.arr = list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        pool = ThreadPool(4)
        pool.map(self.helper_function, range(10))
        print(self.arr)


if __name__ == '__main__':
    c = MyClass()
    c.main_function()

使用map而不是复杂的多线程调用的想法来自我最喜欢的博客文章之一:https://chriskiehl.com/article/parallelism-in-one-line