当您使用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
时没有必要通过网络共享信息 和类型足以满足您的需求 。
Value
比Manager
更快。
警告
顺便说一句,跨进程共享数据/线程,应尽量避免使用。上面的代码可能会按预期运行,但会增加执行foo
所需的时间,事情会变得很奇怪。比较以上:
def foo(data, name=''):
print type(data), data.value, name
for j in range(1000):
data.value += 1
你需要一个Lock
正确地完成这项工作。
关于这一切,我并不是特别需要知道,所以也许别人会来,并提供更多的见解。我想我会提出一个答案,因为这个问题没有得到关注。希望有所帮助。
相关:http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing –