进程 锁和事件和进程队列★★★★★

本文深入探讨进程间的同步机制,包括锁(Lock)、信号量(Semaphore)、事件(Event)和进程队列。通过实例分析12306抢票软件、红绿灯模拟及生产者消费者模型,阐述如何利用这些工具实现进程间的资源共享与状态控制,强调在使用Manager、Queue等进行数据共享时需注意的锁和同步问题。
摘要由CSDN通过智能技术生成

###锁 lock(同一时间上一把锁,会在自己内部给各个进程发出消息(状态)) ★★★★★

#高访问量的都是用到多进程和多线程(速度快)
#引入锁Lock
#上锁会从异步变成同步,有先有后
#如果必须要同步执行操作(有先有后),将执行操作的内容前后进行上锁
#函数的调用处和定义处,普通参数要一一对应,关键字参数有就用自己的,没有就默认用定义处的,如果需要在引入函数处理逻辑,要将处理的参数给调用处
#args后面的参数是普通参数要一一对应,有给出的参数要用给出的参数,没有就写定义处的
from multiprocessing import Process,Lock

lock的基本语法

上锁和解锁是一对,只上锁不解锁会发生死锁现象(程序发生阻塞,下面的代码不执行了)
互斥锁: 互斥锁是进程之间的互相排斥,谁抢到了资源谁就先使用,后抢到资源的后使用.

创建一把锁
lock = Lock()

上锁
lock.acquire()
执行操做....
解锁
lock.release()

lock.acquire() 死锁阻塞.
print("执行程序 .... ")

(2) 模拟12306 抢票软件 ★★★★★

#如果和文件有关,用dump和load,进行反序列化用dumps和loads
#所有的文件都按照字典的形式存储
#思路:抢票之前会有一个查询状态(读取文件),抢票(抢完票以后要跟新数据库)先将数据库中票数读取出来(调用读取函数,参数设置为r模式),然后进行判断,有票然后票数递减1,将剩余的票数更新到数据库中(在将新的字典写进去),有读和写在创建一个函数,通过在创建一个主函数,进行统一调用,然后将文件读取出来,查看谁正在查询票数,在将抢票进行上锁.注意参数.
#抢票会有延迟,抢票是多人异步,
#另外思路:先有一个主干(整体调用)1:先查询(将文件读取出来,异步)  2:在抢票(同步,抢票以后更新数据) 

import json,time
读取票数,更新票数
def wr_info(sign,dic=None): ==>设置一个标记和开始时默认的更新票数(买了以后更新)
	if sign == "r":  ==>将票数读取出来
		with open("ticket",mode="r",encoding="utf-8") as fp:
			dic = json.load(fp)
		return dic
	elif sign == "w":  ===>将剩下的票数更新进去,默认没有
		with open("ticket",mode="w",encoding="utf-8") as fp:
			json.dump(dic,fp)
		
抢票方法
def get_ticket(person):
	# 获取数据库中实际数据
	dic = wr_info("r")

	# 模拟网络延迟
	time.sleep(0.5)	

	if dic["count"] > 0:
		print("%s抢到票了" % (person))
		dic["count"] -= 1
		# 更新数据库
		wr_info("w",dic)
	else:
		print("%s没有抢到这张票" % (person))


def run(person,lock):
	# 读取数据库中的实际票数
	dic = wr_info("r")
	print("%s 查询票数 : %s" % (person,dic["count"]))	==>查询数据多人可查,不需要上锁


	# 上锁
	lock.acquire()
	# 抢票  ==>抢票的时候上锁就可以了
	get_ticket(person)
	# 解锁
	lock.release()

if __name__ == "__main__":
	lock = Lock()
	lst =["刘思敏7","云超1","张恒2","尉翼麟3","王振4","黎建忠5","刘鑫炜6","李天兆8","魏小林9","李博10"]  ==>多人抢票(同时),会出现10个进程
	for i in lst:
		p = Process(target=run,args=(i,lock))
		p.start()

总结: 区分同步和异步;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值