python_day33

文章讲述了使用Python的multiprocessing模块实现的互斥锁在12306抢票软件中的应用,通过`Lock`控制并发访问数据库,避免死锁,确保按顺序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今日课多,更新较少

# ### 锁 lock 互斥锁
from multiprocessing import Process,Lock
""" 上锁和解锁是一对, 连续上锁不解锁是死锁 ,只有在解锁的状态下,其他进程才有机会上锁 """

"""
# 创建一把锁
lock = Lock()
# 上锁
lock.acquire()
# lock.acquire() # 连续上锁,造成了死锁现象;
print("我在袅袅炊烟 ..  你在焦急等待 ... 厕所进行时 ... ")
# 解锁
lock.release()
"""

# ### 12306 抢票软件
import json,time,random

# 1.读写数据库当中的票数
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)

# dic = wr_info("w",dic={"count":0})
# print(dic , type(dic) )

# 2.执行抢票的方法
def get_ticket(person):
	# 先获取数据库中实际票数
	dic = wr_info("r")
	
	# 模拟一下网络延迟
	time.sleep(random.uniform(0.1,0.7))
	
	# 判断票数
	if dic["count"] > 0:
		print("{}抢到票了".format(person))
		# 抢到票后,让当前票数减1
		dic["count"] -= 1
		# 更新数据库中的票数
		wr_info("w",dic)
	else:
		print("{}没有抢到票哦".format(person))
		
# 3.对抢票和读写票数做一个统一的调用
def main(person,lock):
	
	# 查看剩余票数
	dic = wr_info("r")
	print("{}查看票数剩余: {}".format(person,dic["count"]))
	
	# 上锁
	lock.acquire()
	# 开始抢票
	get_ticket(person)
	# 解锁 
	lock.release()
	
if __name__ == "__main__":
	lock = Lock()
	lst = ["梁新宇","康裕康","张保张","于朝志","薛宇健","韩瑞瑞","假摔先","刘子涛","黎明辉","赵凤勇"]
	for i in lst:
		p = Process(    target=main,args=(  i  , lock  )   )
		p.start()
	
"""
创建进程,开始抢票是异步并发程序
直到开始抢票的时候,变成同步程序,
先抢到锁资源的先执行,后抢到锁资源的后执行;
按照顺序依次执行;是同步程序;
"""
	
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值