#######################总结#######
主要理解 锁 生产者消费者模型 解耦用的
共享资源的时候 是不安全的 所以用到后面的锁
守护进程:p.daemon = True #将该进程设置为守护进程,必须写在start之前,意思如果我的主进程代码运行结束了,你这个子进程不管运行到什么地方,都直接结束
#创建一个ticket 文件 里面放上字典 {‘count‘: 1}
#加锁方法 import time from multiprocessing import Process,Lock def f1(i,lic): lic.acquire() time.sleep(1) print(i) lic.release() if __name__ == ‘__main__‘: lic = Lock() for i in range(20): p = Process(target=f1, args=(i,lic)) p.start()
抢票程序
import time from multiprocessing import Process,Lock def show_t(i):#传参i 10个人查看 with open(‘ticket‘,‘r‘,encoding=‘utf-8‘) as f: ticket_data = f.read()#读取文件里的内容 t_data = eval(ticket_data)#将里面的文件转成成字典格式 print(‘%s查询剩余票数为%s‘%(i,t_data[‘count‘])) def get_t(i,l1):#传入10个人进行抢票 # with l2:第二种写法 l1.acquire() #进行加锁循环,而谁能抢到票是由操作系统决定的 with open(‘ticket‘, ‘r‘, encoding=‘utf-8‘) as f: ticket_data = f.read() t_data = eval(ticket_data) if t_data[‘count‘] > 0:#进行判断 如果余票大于0 t_data[‘count‘] -= 1#就进行减1操作 print(‘%s抢票成功‘%i) time.sleep(0.2) with open(‘ticket‘, ‘w‘) as f: f.write(str(t_data)) else: print(‘没票了!!!‘) l1.release() if __name__ == ‘__main__‘: l1 = Lock() for i in range(10): p1 = Process(target=show_t,args=(i,)) p1.start() for i in range(10): p2 = Process(target=get_t,args=(i,l1) ) p2.start() #################### 1查询剩余票数为1 2查询剩余票数为1 3查询剩余票数为1 7查询剩余票数为1 0查询剩余票数为1 5查询剩余票数为1 8查询剩余票数为1 6查询剩余票数为1 4查询剩余票数为1 2抢票成功 9查询剩余票数为1 没票了!!! 没票了!!! 没票了!!! 没票了!!! 没票了!!! 没票了!!! 没票了!!! 没票了!!! 没票了!!! Process finished with exit code 0
如果没有锁 会有10个进程 进行 异步同时请求 这个顺序是由操作系统决定的 每个人都能执行到 if count>0 都执行了 -1操作,都感觉自己抢到票了,导致结果也不一样
python 进程锁 生产者消费者模型 队列 (守护进程,数据共享等)
原文:https://www.cnblogs.com/zaizai1573/p/10247646.html