[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)

"""

 

posted @ 2018-09-12 16:19  sunzebo  阅读(238)  评论(0编辑  收藏  举报