如何在 python 中使用多处理附加到 class 变量?

How can I append to class variables using multiprocessing in python?

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

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)

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]

多处理很棘手。

对于简单的多处理任务,我会推荐:

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