Python多处理附加列表

时间:2014-08-20 18:11:18

标签: python variables multiprocessing shared

使用Multiprocessing.Pool()快速了解多个进程之间的共享变量。

如果我要从多个进程中更新全局列表,是否会遇到任何问题?即如果其中两个进程试图同时更新列表。

我已经看过有关使用Lock进行类似操作的文档,但我想知道是否有必要。

编辑:

我分享这个变量的方法是在我的回调函数中使用一个全局变量, '成功'在目标函数完成后,我将所有成功的操作附加到其中:

TOTAL_SUCCESSES = []

def func(inputs):
    successes = []

    for input in inputs:
        result = #something with return code
        if result == 0:
            successes.append(input)
    return successes

def callback(successes):
    global TOTAL_SUCCESSES

    for entry in successes:
        TOTAL_SUCCESSES.append(entry)

def main():     
    pool = mp.Pool()
    for entry in myInputs:
         pool.apply_async(func, args=(entry,),callback=callback)         

为任何语法错误道歉,快速写下来但该程序正在工作,只是想知道如果我有问题我是否添加共享变量。

提前致谢!

1 个答案:

答案 0 :(得分:12)

使用您当前的代码,您实际上并不在进程之间共享CURRENT_SUCCESSEScallback在主进程中在结果处理线程中执行。只有一个结果处理线程,因此每个callback将一次运行一个,而不是同时运行。所以你编写的代码是进程/线程安全的。

但是,您忘记从successes返回func,您需要修复此问题。

修改

此外,使用map

可以更简洁地编写
def func(inputs):
    successes = []

    for input in inputs:
        result = #something with return code
        if result == 0:
            successes.append(input)
    return successes

def main():     
    pool = mp.Pool()
    total_successes = pool.map(func, myInputs) # Returns a list of lists
    # Flatten the list of lists
    total_successes = [ent for sublist in total_successes for ent in sublist]