Day39.互斥锁

1.互斥锁_模拟多用户抢票功能流程

  创建文本文件data,加入字典{"ticket_mum": 0},设定余票数

'''
互斥锁(Lock): 多个进程操作同一份数据的时候,会出现数据错乱的问题,针对上述问题,解决方式就是加速处理:
            核心:将并发变成串行,牺牲效率但是保证了数据的安全
'''
from multiprocessing import Process, Lock
import json
import time
import random


# todo 查票
def search(i):
    # todo 文件操作读取票数
    with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'r', encoding='UTF-8') as f:
        dic = json.load(f)
        print('用户{}查询余票:{}'.format(i, dic.get('ticket_mum')))

# todo 买票
# todo 1. 先查 2. 再买
def buy(i):
    # todo 先查票
    with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'r', encoding='UTF-8') as f:
        dic = json.load(f)
        # print('用户{}查询余票:{}'.format(i, dic.get('ticket_mum')))
    # todo 模拟网络延迟
    time.sleep(random.randint(1, 3))
    # todo 判断当前是否有票
    if dic.get('ticket_mum') > 0:
        # todo 修改数据库 买票
        dic['ticket_mum'] -= 1
        # todo 写入数据库
        with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'w', encoding='UTF-8') as f:
            json.dump(dic, f)
        print('用户{}买票成功'.format(i))
    else:
        print('用户{}买票失败'.format(i))

def run(i, mutex):
    search(i)
    # todo 给买票环节解锁处理
    # todo 抢锁
    mutex.acquire()
    buy(i)
    # todo 释放锁
    mutex.release()


if __name__ == '__main__':
    # todo 在主进程中生成一把锁,让所有的子进程抢,谁先抢到谁先买票
    mutex = Lock()
    # todo 开启多进程
    for i in range(1, 11):
        p = Process(target=run, args=(i, mutex))
        p.start()

'''
扩展:行锁,表锁

注意:
    1. 锁不要轻易使用,容易造成死锁现象(一般不会用到,都是内部封装好的)
    2. 锁只在处理数据的部分加,保证数据安全(只在争抢数据的环节加锁处理即可)
'''

posted on 2024-07-18 14:12  与太阳肩并肩  阅读(1)  评论(0编辑  收藏  举报

导航