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

Posted

技术标签:

【中文标题】如何在并行进程(python)中将项目附加到列表中?【英文标题】:How to append items to a list in a parallel process (python)? 【发布时间】:2018-02-07 05:49:57 【问题描述】:

这是我正在使用的更复杂代码的一个非常简单的版本。问题是我想将在 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.

提前致谢。

【问题讨论】:

全局变量不能跨 python 进程共享。最简单的解决方案是从method 返回 7 和 8,然后将 8 收集到一个列表中。见Pool.map 【参考方案1】:

您似乎在 method() 中设置了global list,但它是空的。如果您之前设置过,则不需要在 method() 中。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:
pool.apply_async(method,callback=logResult)
    您的方法函数丢失 ()。 logResult 应该有一些东西可以传递(根据您的代码)

简单地改成这样:

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

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

【讨论】:

以上是关于如何在并行进程(python)中将项目附加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将多个变量附加到列表中

在 Python 2.7.3 中将 csv 文件附加到一个空列表中 - 获取一个空列表

在 Numpy Python 中将一维数组附加到二维数组

在 Python 中将列表附加到自身

运行一个并行进程,保存 Python 中主进程的结果

如何在 Discord Py 中将列表附加并保存到另一个文件中?