from multiprocessing import Manager,Process,Lock
# def work(d,lock):
#     with lock: #不加锁而操作共享的数据,肯定会出现数据错乱
#         d['count']-=1
#
# if __name__ == '__main__':
#     lock=Lock()
#     with Manager() as m:
#         dic=m.dict({'count':100})
#         p_l=[]
#         for i in range(100):
#             p=Process(target=work,args=(dic,lock))
#             p_l.append(p)
#             p.start()
#         for p in p_l:
#             p.join()
#         print(dic)

def work(d):
    d["count"] += 1

if __name__ == '__main__':
    lock = Lock()
    m = Manager()  # 返回的是一个管理器对象
    dic = m.dict({"count":100})   # 管理对象创建的字典,具有排它性,同一时刻多个进程访问报错
    p = Process(target=work,args=(dic,))
    p.start()
    p.join()  # 注释掉,这一行,会报错
    print(dic)


# A manager object returned by Manager() controls a server process which holds Python objects and
# allows other processes to manipulate them using proxies.
import time
import random
from multiprocessing import Process,Manager
import multiprocessing
def eat(ls):
    print("先洗洗手...")
    time.sleep(random.randint(1,5))
    food =ls.pop()
    print(f"开始吃{food}")
    ls.append("lemon")


if __name__ == '__main__':
    m = Manager()
    # print(m)
    m_fruit_ls = m.list(["apple","pear","melon"])
    print(m_fruit_ls)
    p1 = Process(target=eat,args=(m_fruit_ls,))
    p1.start()
    p1.join()
    print(m_fruit_ls)
# # 执行结果如下:
# ['apple', 'pear', 'melon']
# 先洗洗手...
# 开始吃melon
# ['apple', 'pear', 'lemon']

 

posted on 2018-09-25 17:08  yellwonfin  阅读(491)  评论(0)    收藏  举报