python摸爬滚打之day031----同步锁 信号量 事件 队列 生成者消费者模型 Jionablequeue
1、同步锁
进程之间数据不共享, 但是可以共享同一套文件系统, 所以访问同一个文件, 是没有问题的. 而共享带来的是数据不安全, 进程1拿到某数据但是还未对文件进行更改, 同时进程2也拿到数据, 拿到的是为更改的数据, 造成数据错乱, 使用同步锁可以解决这一问题.
1 import json,time 2 from multiprocessing import Lock,Process 3 4 def show_ticket(): 5 content = json.load(open("ticket","r")) # 文件里的数据是 {"count": 2} 6 print(f"剩余票数为{content['count']}") 7 8 9 def get(): 10 data = json.load(open("ticket","r")) 11 time.sleep(1) 12 if data["count"] <= 0: 13 print("没有票啦") 14 else: 15 data["count"] -= 1 16 json.dump(data,open("ticket","w")) 17 time.sleep(0.2) 18 print("抢到票啦") 19 20 21 def act(l): 22 23 l.acquire() # 上锁 (因为此时这个进程和其他的进程处于同步状态, 所以这个锁也叫作同步锁) 24 show_ticket() 25 get() 26 l.release() # 解锁 27 28 29 if __name__ == '__main__': 30 l = Lock() # 实例一个同步锁 31 for i in range(10): 32 p = Process(target=act,args=(l,)) 33 p.start()
2、
3、
4、
5、
6、
7、
8、