目录
并发编程
3.进程
16)互斥锁
(1)什么是互斥锁
将并发/并行改为串行(类似单道)
,牺牲了效率保障了数据的安全
除了有互斥锁,还有:行锁、表锁、乐观锁、悲观锁..等
(2)互斥锁如何使用
from multiprocessing import Lock # 导入互斥锁模块
mutex = Lock() # 产生锁
mutex.acquire() # 抢锁
# (操作数据代码)
mutex.release() # 释放锁
"""
注:
互斥锁之应该放在程序操作的上下,其他位置不要加 会让整个程序的效率特别低
"""
(3)互斥锁解决模拟抢票问题
from multiprocessing import Process,Lock
import time
import json
import random
# 查票
def search(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
print(f'{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(f'{name}买票成功')
else:
print(f'{name}很倒霉 没有抢到票')
def run(name, mutex):
search(name)
mutex.acquire() # 抢锁
buy(name)
mutex.release() # 释放锁
if __name__ == '__main__':
mutex = Lock() # 产生一把锁
for i in range(3):
p = Process(target=run, args=(f'用户{i}', mutex))
p.start()
"""
执行结果:
用户0在查票 当前余票为:1
用户1在查票 当前余票为:1
用户2在查票 当前余票为:1
用户0买票成功
用户1很倒霉 没有抢到票
用户2很倒霉 没有抢到票
"""
4.线程
1)线程理论
进程:进程是资源单位
,表示一块内存空间
线程:线程是执行单位
,表示真正的代码指令
进程可以理解为车间 线程可以理解为流水线
一个进程内【至少会含有一个线程】!!!!