gpt4 book ai didi

Python 多处理 - 全局列表中的共享计数器未正确递增

转载 作者:行者123 更新时间:2023-12-01 05:10:49 25 4
gpt4 key购买 nike

我正在尝试在多处理中实现共享计数器。我正在使用全局变量来解决酸洗问题。由于我不明白的原因,增量似乎不适用于我的全局计数器列表(该值始终为 0)。我猜代码正在使用被丢弃的变量的本地实例。

我认为全局列表可以修改,因为它们是可变的。我还尝试显式定义 global list_global指定我要使用变量的全局定义。

有人可以指出我的错误吗?

from multiprocessing import Pool, Value, Lock

list_global = [] # global variable to hold Counter values


#http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing/
class Counter(object):
def __init__(self, initval=0):
self.val = Value('i', initval)
self.lock = Lock()
## self.val = initval

def increment(self):
with self.lock:
self.val.value += 1

def value(self):
with self.lock:
return self.val.value


def process_item(x):
global list_global
list_global[0].increment() # increments
return list_global[0].value() # correctly returns incremented value


def main():
global list_global

print 'before', list_global[0].value()

pool = Pool()
print pool.map(process_item, range(10))
pool.close()
pool.join()

#increments in process_item are not persistent
#(do not appear to be modifying the global variable)
print 'after', list_global[0].value() #=> 0


# list_global holds 3 Counter objects
for i in range(3):
list_global.append(Counter(0))


if __name__ == '__main__':
global list_global
main()
#print list_global # list_global holds "Counter" objects
for i in list_global:
print i.value(), #=>[0,0,0] # expected [10,0,0]

最佳答案

比我的评论更具体,您的问题是您从根本上误解了多重处理正在做什么,这会对您的输出产生错误的期望。您不能声明全局变量然后在多个进程之间共享它。当您使用线程时,您可以摆脱更多的麻烦,但为了理解为什么会遇到麻烦,您需要了解多处理在做什么

Pool.map()启动您的子进程时,每个子进程都会启动自己的Python解释器,并在其中导入您的顶级函数process_item.这个单独的解释器实例还创建自己list_global实例。 每个子进程都会发生这种情况。您对 global 的调用不仅仅会神奇地使这些单独的运行进程共享模块中定义的列表。

关于Python 多处理 - 全局列表中的共享计数器未正确递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24271682/

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