gpt4 book ai didi

Python 多处理附加列表

转载 作者:太空狗 更新时间:2023-10-29 17:31:34 25 4
gpt4 key购买 nike

有一个关于使用 Multiprocessing.Pool() 的多个进程之间的共享变量的快速问题。

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

我看过有关将 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)

对任何语法错误表示歉意,很快就把它写下来了,但程序正在运行,只是想知道如果我添加共享变量会不会有问题。

提前致谢!

最佳答案

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

但是,您忘记了从 func 返回successes,您需要修复它。

编辑:

此外,使用 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]

关于Python 多处理附加列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25411673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com