小编典典

Python多重处理附加清单

python

有一个关于使用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)

抱歉出现语法错误,请速记一下,但是程序正在运行,只是想知道是否添加共享变量是否会出现问题。

提前致谢!


阅读 219

收藏
2021-01-20

共1个答案

小编典典

使用当前的代码,您实际上并没有CURRENT_SUCCESSES在进程之间共享。callback在主进程的结果处理线程中执行。只有一个结果处理线程,因此每个线程只能一次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]
2021-01-20