互斥锁
- 为当前进程或线程添加额外的限制,限制当前时间段只能有当前进程使用,结束后才能被其他进程继续使用
- 主要用在多线程中
- 效果等同于串行(局部串行,只在数据修改部分使用)
- 牺牲效率,包装安全
- 例子:12306买票
from multiprocessing import Lock
lock.acquire()
lock.release()import json
import multiprocessing
import time
import random
互斥锁
12306抢票
ticket = {'rest_ticket': 5}
def init_data(data):
with open('ticket.json', 'w', encoding='utf8') as f:
json.dump(data, f)
def read_ticket():
with open('ticket.json', 'r', encoding='utf8') as f:
data = json.load(f)
return data
def buy(name, lock):
lock.acquire()
data = read_ticket()
if data.get('rest_ticket') > 0:
data['rest_ticket'] -= 1
# time.sleep(random.randint(1, 5)) # 这句话不加就可以正常执行?
print(f'{name} 抢到了一张票,还剩{data["rest_ticket"]}张')
init_data(data)
else:
print(f'{name} 抢票失败')
lock.release()
def search(name):
data = read_ticket()
print(f'{name}看到了{data["rest_ticket"]}张票!')
def main(name, lock):
search(name)
buy(name, lock)
def main_process():
lock = multiprocessing.Lock()
task_list = []
for i in range(10):
task = multiprocessing.Process(target=main, args=(f'user_{i}', lock))
task.start()
task_list.append(task)
for task in task_list:
task.join()
if name == 'main':
init_data(ticket)
print(f'开始抢票')
main_process()
print(f'结束抢票')