gpt4 book ai didi

python - 如何使用 Python 在多处理池中使用值

转载 作者:太空狗 更新时间:2023-10-30 01:07:17 24 4
gpt4 key购买 nike

我希望能够使用多处理库中的值模块来跟踪数据。据我所知,在 Python 中进行多处理时,每个进程都有自己的副本,因此我无法编辑全局变量。我希望能够使用 Values 来解决这个问题。有谁知道如何将 Values 数据传递到合并函数中?

from multiprocessing import Pool, Value
import itertools

arr = [2,6,8,7,4,2,5,6,2,4,7,8,5,2,7,4,2,5,6,2,4,7,8,5,2,9,3,2,0,1,5,7,2,8,9,3,2,]

def hello(g, data):
data.value += 1

if __name__ == '__main__':
data = Value('i', 0)
func = partial(hello, data)
p = Pool(processes=1)
p.map(hello,itertools.izip(arr,itertools.repeat(data)))

print data.value

这是我遇到的运行时错误:

RuntimeError: Synchronized objects should only be shared between processes through inheritance

有人知道我做错了什么吗?

最佳答案

我不知道为什么,但是使用 Pool 似乎有一些问题,如果手动创建子进程则不会。例如。以下作品:

from multiprocessing import Process, Value

arr = [1,2,3,4,5,6,7,8,9]


def hello(data, g):
with data.get_lock():
data.value += 1
print id(data), g, data.value

if __name__ == '__main__':
data = Value('i')
print id(data)

processes = []
for n in arr:
p = Process(target=hello, args=(data, n))
processes.append(p)
p.start()

for p in processes:
p.join()

print "sub process tasks completed"
print data.value

但是,如果您使用 Pool 进行基本相同的思考,则会收到错误“RuntimeError:同步对象只能通过继承在进程之间共享”。我以前在使用池时看到过这个错误,但从未完全弄清楚它的底部。

使用似乎与 Pool 一起使用的 Value 的替代方法是使用 Manager 为您提供“共享”列表:

from multiprocessing import Pool, Manager
from functools import partial


arr = [1,2,3,4,5,6,7,8,9]


def hello(data, g):
data[0] += 1


if __name__ == '__main__':
m = Manager()
data = m.list([0])
hello_data = partial(hello, data)
p = Pool(processes=5)
p.map(hello_data, arr)

print data[0]

关于python - 如何使用 Python 在多处理池中使用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32029660/

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