python 多处理中的共享变量
- 2025-02-27 09:06:00
- admin 原创
- 83
问题描述:
第一个问题是 Value 和 Manager().Value 有什么区别?
其次,是否可以不使用 Value 来共享整数变量?下面是我的示例代码。我想要的是获取一个值为整数而不是 Value 的字典。我所做的只是在处理之后将其全部更改。有没有更简单的方法?
from multiprocessing import Process, Manager
def f(n):
n.value += 1
if __name__ == '__main__':
d = {}
p = []
for i in range(5):
d[i] = Manager().Value('i',0)
p.append(Process(target=f, args=(d[i],)))
p[i].start()
for q in p:
q.join()
for i in d:
d[i] = d[i].value
print d
解决方案 1:
使用时,Value
您将获得ctypes
共享内存中的一个对象,默认情况下,该对象使用 进行同步RLock
。使用时,Manager
您将获得一个SynManager
控制服务器进程的对象,该进程允许其他进程操纵对象值。您可以使用同一个管理器创建多个代理;无需在循环中创建新的管理器:
manager = Manager()
for i in range(5):
new_value = manager.Value('i', 0)
可以Manager
跨计算机共享,但Value
仅限于一台计算机。 Value
会更快(运行下面的代码查看),所以我认为你应该使用它,除非你需要支持任意对象或通过网络访问它们。
import time
from multiprocessing import Process, Manager, Value
def foo(data, name=''):
print(type(data), data.value, name)
data.value += 1
if __name__ == "__main__":
manager = Manager()
x = manager.Value('i', 0)
y = Value('i', 0)
for i in range(5):
Process(target=foo, args=(x, 'x')).start()
Process(target=foo, args=(y, 'y')).start()
print('Before waiting: ')
print('x = {0}'.format(x.value))
print('y = {0}'.format(y.value))
time.sleep(5.0)
print('After waiting: ')
print('x = {0}'.format(x.value))
print('y = {0}'.format(y.value))
总结一下:
用于
Manager
创建多个共享对象,包括字典和列表。用于Manager
在网络上的计算机之间共享数据。当不需要通过网络共享信息并且中的类型足以满足您的需要时,请使用
Value
或。Array
`ctypes`Value
比 快Manager
。
警告
顺便说一句,应尽可能避免跨进程/线程共享数据。上面的代码可能会按预期运行,但增加执行时间foo
,事情就会变得奇怪。将上面的代码与以下内容进行比较:
def foo(data, name=''):
print type(data), data.value, name
for j in range(1000):
data.value += 1
您需要一个Lock
才能使其正常工作。
我对这一切并不特别了解,所以也许其他人会来提供更多见解。我想我会贡献一个答案,因为这个问题没有引起人们的注意。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD