如何在并行进程(python)中将项追加到列表中?

时间:2017-08-29 17:11:24

标签: python list parallel-processing append

这是我正在使用的更复杂代码的一个非常简单的版本。问题是我想将method()函数中计算的项追加到我稍后可以显示的列表中。但是,运行此代码时,列表对象为空,而结果数组已满。

    import multiprocessing as mp
    global list
    list = []
    def add(thing):
        list.append(thing)
    def method():
        global list
        add(8) #doesn't work as wanted
        return 7
    def logResult(result):
        results.append(result)

    if (__name__ == '__main__'):
        results = []
        cpu = mp.cpu_count()
        pool = mp.Pool(processes=cpu)
        for x in range(0, 2000):
            pool.apply_async(method,callback=logResult)
        pool.close()
        pool.join()
        print list
        print results

输出:

    []
    [7,7,7,7,7,7,7,7,7....] and so on.

我知道add方法似乎是多余的,但是method()函数中的一个简单的list.append()也不起作用。 add方法用于镜像logResult方法()。我可以看出为什么它不起作用,但我不知道如何解决这个问题。如果没有并行化,程序将按照需要工作,但我的项目需要并行化,因为完成的计算比method()函数要繁琐得多。期望的输出将是

    [8,8,8,8,8,8,8,8,8,8,8,8,...]
    [7,7,7,7,7,7,7,7,7,7,7,7,...] and so on.

提前致谢。

3 个答案:

答案 0 :(得分:2)

列表应驻留在共享内存中,以便可以从工作程序子进程访问。考虑multiprocessing.Manager().list()

答案 1 :(得分:0)

似乎你在method()中设置了global list为空。如果之前已经设置过,则不需要在method()中。

答案 2 :(得分:0)

pool.apply_async(method,callback=logResult)
  1. 您的方法功能缺失()。
  2. logResult应该传递一些东西(根据你的代码)
  3. 只需改为:

    pool.apply_async(method(),callback=logResult(7))
    

    得到结果[8,8,8,8,8 ...],[7,7,7,7,7 ...]