进程同步锁
2022/5/4 7:14:10
本文主要是介绍进程同步锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,但是它们之间的运行没有顺序,一旦开启也不受我们控制。
- 尽管并发编程让我们能更加充分的利用计算机的资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件是没有问题的,要是对同一文件进行读写操作呢?要知道共享带来的是竞争,竞争带来的结果就是错乱。
from multiprocessing import Process import json,time #在当前目录下创建一个文件(db) #文件db的内容:{"count":1}表示的是余票数量 def search(): #查询余票 fp = open('db','r') dic = json.load(fp) #反序列化,将文件中的json数据转换成python字典 print('剩余车票数为:{}'.format(dic['count'])) def get(): #抢票,每次只能购买一张 fp = open('db', 'r') dic = json.load(fp) time.sleep(0.1) if dic['count'] > 0: time.sleep(0.2) dic['count'] -= 1 time.sleep(0.1) json.dump(dic, open('db', 'w')) #购票后,回写到文件中 print('购票成功') def task(): search() #先查询 get() #后购买 if __name__ == "__main__": for i in range(3): p = Process(target=task) p.start() #运行结果 #剩余车票数为:1 #剩余车票数为:1 #剩余车票数为:1 #购票成功 #购票成功 #购票成功
- 上述案例中,总的票数只有1张,我们确成功购票三次。很明显存在问题。
- 如何控制,就是加锁处理
- 加锁流程
- 1.导包:from multiprocessing import Lock
- 2.加锁:lock.acquire()
- 3.解锁:lock.release()
- 加锁流程
- 下面我们还是以抢票为例,看看加锁后数据是否还会存在问题;
- 加锁后
from multiprocessing import Process import json,time from multiprocessing import Lock #在当前目录下创建一个文件(db) #文件db的内容:{"count":1}表示的是余票数量 def search(): #查询余票 fp = open('db','r') dic = json.load(fp) #反序列化,将文件中的json数据转换成python字典 print('剩余车票数为:{}'.format(dic['count'])) def get(): #抢票,每次只能购买一张 fp = open('db', 'r') dic = json.load(fp) time.sleep(0.1) if dic['count'] > 0: time.sleep(0.2) dic['count'] -= 1 time.sleep(0.1) json.dump(dic, open('db', 'w')) #购票后,回写到文件中 print('购票成功') def task(lock): lock.acquire() #加锁 search() #先查询 get() #后购买 lock.release() #解锁 if __name__ == "__main__": lock = Lock() #创建一把进程锁 for i in range(3): p = Process(target=task,args=(lock,)) p.start() #运行结果 #剩余车票数为:1 #购票成功 #剩余车票数为:0 #剩余车票数为:0
注意点:加锁会失去异步效果
这篇关于进程同步锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南