互斥锁

互斥锁理论

'''
多个线程同时要修改同一份数据,类似抢票等,
都需要用到互斥锁 虽然影响效率,但保证数据安全
'''


import json
from multiprocessing import Process, Lock
import multiprocessing
import time
import os
import random


# 查票
def search(i):
    # 读取票数
    with open('火车票.txt', 'r', encoding='utf8') as f:
        dic = json.load(f)
    print(f'用户:{i},查询票数:{dic.get("ticket_num")}')


# 买票 1,先查 2,再买
def buy(i):
    with open('火车票.txt', 'r', encoding='utf8') as f:
        dic = json.load(f)
    time.sleep(random.randint(1, 3))
    # 判断当前是否有票
    if dic.get('ticket_num') > 0:
        dic['ticket_num'] -= 1
        with open('火车票.txt', 'w', encoding='utf8') as f:
            json.dump(dic, f)
            print(f'用户:{i}购票成功')
    else:
        print(f'用户:{i}购票失败')


# 整合功能函数
def run(i, mutex):
    search(i)
    # 给买票环节加锁处理
    # 先抢锁
    mutex.acquire()
    # 抢锁
    buy(i)
    mutex.release()
    # 释放锁


if __name__ == '__main__':
    # 在主进程生产一把锁,所有子进程抢
    # 谁抢到了锁就可以进去买
    multiprocessing.set_start_method('fork')
     # mac 系统需要加这一行
    mutex = Lock()
    for i in range(1, 10):
        p = Process(target=run, args=(i, mutex,))
        p.start()

'''
多个进程 操作同一份数据的时候,会出现数据错乱的问题
针对上述问题,解决方式就是加锁处理
加锁可以将并发编程串行,牺牲了效率,保证了数据安全
'''
posted @   Python-moon  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示