[b0036] python 归纳 (二一)_多进程数据共享和同步_服务进程Manager
# -*- 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 import Process,Manager import time def func1(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 in xrange(len(shareList)): shareList[i] += 1 shareValue.value += 1 shareDict[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" print list1 print dict1 print array1 print value1 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 in proc: p.join() print "after" print list1 print dict1 print array1 print value1 """ 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) """
写满200篇博文再说