互斥锁

  1. 为当前进程或线程添加额外的限制,限制当前时间段只能有当前进程使用,结束后才能被其他进程继续使用
  2. 主要用在多线程中
  3. 效果等同于串行(局部串行,只在数据修改部分使用)
  4. 牺牲效率,包装安全
  5. 例子: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'结束抢票')

posted @ 2024-05-21 11:07  zenopan  阅读(3)  评论(0编辑  收藏  举报