并发编程(互斥锁)

Python互斥锁

	互斥锁是什么?
			将并发变成串行 虽然牺牲了程序的执行效率 但是保证了数据安全
		
	什么时候使用互斥锁呢?
		多个程序同时操作一份数据的时候容易产生数据错乱
		为了避免数据错乱 我们需要使用到互斥锁
	
	如何使用?
		导入模块 from multiprocessing import Process, Lock
		mutex = Lock()		# 变量名创建一个锁
		mutex.acquire()  	# 抢锁
		mutex.release()		# 释放锁
		上一锁 谁先抢到谁使用 其他人等着使用完才能使用

	模拟12306 模拟抢票 查票 买票  
		from multiprocessing import Process
		import time
		import json		# 导入需要使用的模块
		import random
		
		
		# 查票
		def search(name):		# 文件内数据 ticket_num : 1
		    with open(r'data.json', 'r', encoding='utf8') as f:
		        data = json.load(f)			
		    print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))
		
		
		# 买票
		def buy(name):
		    # 再次确认票
		    with open(r'data.json', 'r', encoding='utf8') as f:
		        data = json.load(f)
		    time.sleep(random.randint(1, 3))	 # 模拟网络延迟
		    if data.get('ticket_num') > 0:		 # 判断是否有票 有就买
		        data['ticket_num'] -= 1
		        with open(r'data.json', 'w', encoding='utf8') as f:
		            json.dump(data, f)
		        print('%s买票成功' % name)
		    else:
		        print('%s很倒霉 没有抢到票' % name)
		
		
		def run(name):
		    search(name)
		    buy(name)
		
		
		if __name__ == '__main__':
		    for i in range(10):
		        p = Process(target=run, args=('用户%s'%i, ))
		        p.start()
		        
		'''输出结果10个人都抢到了票 所以我们需要用到互斥锁!!!'''

	解决方法:
		from multiprocessing import Process, Lock
		import multiprocessing
		import time
		import json
		import random
		
		# 查票
		def search(name):
		    with open(r'data.json', 'r', encoding='utf8') as f:
		        data = json.load(f)
		    print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))

		# 买票
		def buy(name):
		    # 再次确认票
		    with open(r'data.json', 'r', encoding='utf8') as f:
		        data = json.load(f)
		    # 模拟网络延迟
		    time.sleep(random.randint(1, 3))
		    # 判断是否有票 有就买
		    if data.get('ticket_num') > 0:
		        data['ticket_num'] -= 1
		        with open(r'data.json', 'w', encoding='utf8') as f:
		            json.dump(data, f)
		        print('%s买票成功' % name)
		    else:
		        print('%s很倒霉 没有抢到票' % name)
		
		def run(name, mutex):
		    search(name)
		    mutex.acquire()         # 抢锁
		    buy(name)
		    mutex.release()         # 释放锁

		if __name__ == '__main__':
		    multiprocessing.set_start_method("fork")	# MAC本需要添加 WIN不需要
		    mutex = Lock()      # python3.4更新后,默认用“spawn”,开启进程,我们要主动指定为“fork”
		    for i in range(10):  # spawn:使用此方式启动的进程,只会执行和 target 参数或者 run() 方法相关的代码。
		        p = Process(target=run, args=('用户%s' % i, mutex))
		        p.start()

		'''此时的结果就是只有一个人抢到了票 这就是互斥锁的作用 '''

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoisMay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值