當您使用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 –