#-*- coding: utf-8 -*-
"""多进程数据共享 服务器进程 multiprocessing.Manager
入门使用
逻辑:
20个子线程修改共享数据
总结:
1. Mangeer类似 Value,Array
2. 里面内容比较多,这只是入门用法
3. 还可以操作共享自定义对象,本例是基本数据结构
简单使用:
1. 创建多进程管理的 基本数据结构
list1 = manager.list([1,2,3,4,5])
dict1 = manager.dict()
array1 = manager.Array('i',range(10))
value1 = manager.Value('i',1)
2. 有必要创建 锁 相关
lock = manager.Lock()
RLock
Semaphore
Condition
3. 在子进程中 使用
参考:
method: ['Array', 'BoundedSemaphore', 'Condition', 'Event', 'JoinableQueue'
, 'Lock', 'Namespace', 'Pool', 'Queue', 'RLock', 'Semaphore', 'Value', '_Client'
,'_finalize_manager', '_number_of_objects', '_run_server',
'connect', 'dict', 'get_server', 'join', 'list', 'register', 'start']"""
from multiprocessing importProcess,Managerimporttimedeffunc1(shareList, shareValue, shareDict, lock):"""子进程 修改共享数据 代码"""
#lock with 用法
#with lock:
#for i in xrange(len(shareList)):
#shareList[i] += 1
# #shareValue.value += 1
# #shareDict[1] = '1'
#shareDict[2] = '2'
# #time.sleep(1)
lock.acquire()#竞争锁
## 修改共享数据
for i inxrange(len(shareList)):
shareList[i]+= 1shareValue.value+= 1shareDict[1] = '1'shareDict[2] = '2'time.sleep(0.1)
lock.release()#释放锁
if __name__ == '__main__':#创建Manager对象
manager =Manager()#创建多进程共享的数据结构
list1 = manager.list([1,2,3,4,5])
dict1=manager.dict()
array1= manager.Array('i',range(10))
value1= manager.Value('i',1)print "before"
printlist1printdict1printarray1printvalue1
lock= manager.Lock() #创建锁
#创建20个进程对象,放到列表中
proc = [ Process(target=func1, args=(list1,value1,dict1,lock)) for i in xrange(20) ]#启动所有子进程
for p in proc: #并不是第一个启动的进程最先抢到锁
p.start()#等待所有子进程结束
for p inproc:
p.join()print "after"
printlist1printdict1printarray1printvalue1"""Out:
before
[1, 2, 3, 4, 5]
{}
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Value('i', 1)
after
[21, 22, 23, 24, 25]
{1: '1', 2: '2'}
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Value('i', 21)"""