【问题标题】:How to properly set up multiprocessing in python3如何在python3中正确设置多处理
【发布时间】:2018-07-12 16:34:47
【问题描述】:

我正在尝试使用 Python 3.6 多处理一个高度可并行化的问题。问题涉及在实例化时传递数组的类。其中一个成员函数遍历数组并处理数据,然后将其写入另一个列表。我用传统的串行计算附上了这个问题的简化版本;但是,我对多处理示例有点迷茫。我正在尝试创建 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, ))

【问题讨论】:

  • "Can Someone Help Me?" is not a valid SO question。这通常表明您需要的是与当地导师相处或完成教程,而不是 Stack Overflow。
  • 要了解您是否“正确”地设置了进程,请运行您的代码。使用print 语句跟踪执行情况。分阶段工作,而不是尝试一次编写整个设计。当您一次只跟踪一个问题时,调试会容易很多。我已经从两种方式的经验中学到了最后一项。 :-)

标签: python python-3.x python-multiprocessing


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2019-12-19
    • 2011-02-24
    • 1970-01-01
    • 2021-05-22
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多