如何在 python3 中正确设置多处理

How to properly set up multiprocessing in python3

我正在尝试使用 Python 3.6 多处理一个高度并行化的问题。该问题涉及一个 class ,它在实例化时传递了一个数组。其中一个成员函数遍历数组并处理数据,然后将其写入另一个列表。我有一个带有传统串行计算的问题的简化版本;但是,我对多处理示例有点迷茫。我正在尝试创建 2 个进程,一个将从 0 迭代到 4,另一个从 5 迭代到输入列表的长度(即 8)。我不知道我是否正确设置了进程,此外我不确定如何正确加入线程。我不确定这是否应该涉及 Que 或 daeman,如有任何帮助,我们将不胜感激。

from multiprocessing import Process

class Test:
    def __init__(self, array_list):
        self.array_list = array_list

    def func(self, names):
        return 'Test' + names

    def iterate(self, upper, lower):
        output = [self.func(self.array_list[i]) for i in range(lower, upper)]
        return output

if __name__ == "__main__":
    # Serial method
    test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    obj1 = Test(test_list)
    results = obj1.iterate(len(test_list), 0)
    print(results)
    # Attempt at multiprocessed method (Im lost at this point!)
    p = []
    p[0] = Process(target=obj1.iterate, args=(4, 0, ))
    p[1] = Process(target=obj1.iterate, args=(8, 5, ))

此示例使用队列将数据从进程传回主进程。

from multiprocessing import Queue, Process

class Test:
    def __init__(self, array_list):
        self.array_list = array_list

    def func(self, names):
        return 'Test' + names

    def iterate(self, upper, lower):
        output = [self.func(self.array_list[i]) for i in range(lower, upper)]
        return output

if __name__ == "__main__":
    # Serial method
    test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    obj1 = Test(test_list)
    results = obj1.iterate(len(test_list), 0)
    print(results)

    def run_and_send_back_output(queue, func, *args):
        result = func(*args) # run the func
        queue.put(result)    # send the result back


    q = Queue()
    p1 = Process(
        target=run_and_send_back_output,
        args=(q, obj1.iterate, 4, 0)
    )
    p1.start()
    p2 = Process(
        target=run_and_send_back_output,
        args=(q, obj1.iterate, 8, 4)
    )
    p2.start()
    p1.join()
    p2.join()

    results = []
    while not q.empty():
        results.extend(q.get())
    print(results)