首页 > 其他分享 >Day39.互斥锁

Day39.互斥锁

时间:2024-07-18 14:20:36浏览次数:15  
标签:Day39 dic 互斥 mutex mum ticket todo

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. 锁只在处理数据的部分加,保证数据安全(只在争抢数据的环节加锁处理即可)
'''

标签:Day39,dic,互斥,mutex,mum,ticket,todo
From: https://www.cnblogs.com/vless/p/18309416

相关文章

  • Day39.进程对象及其他方法
    1.进程对象及其他方法_current_process.pid查看进程号2.进程对象及其他方法_os.getpid()查看进程号3.进程对象及其他方法_os.getppid()查看子进程的主进程号4.进程对象及其他方法_对象.terminate()杀死进程,对象.is_alive()判断当前进程是否存活 ......
  • linux 互斥锁mutex锁使用示例
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、互斥锁mutex是什么?二、代码示例总结前言提示:这里可以添加本文要记录的大概内容:linux互斥锁mutex锁使用示例,两个线程操作一个全局变量。提示:以下是本篇文章正文内容,下面案例可供......
  • 深入理解Linux内核中的同步与互斥的实现
    1.内联汇编汇编函数的执行效率比C语言更高,但可移植性,可编程性和可读性更差,掌握也更复杂。所以一般使用C语言编程。1.1内联汇编的优点性能优化:内联汇编允许开发者利用底层硬件特性,编写出更高效的代码,尤其是在性能敏感的场景下。直接硬件控制:内联汇编可以直接对硬件寄存......
  • C++11标准库 互斥锁 <mutex> 梳理
    目录<mutex>std::call_once函数例程:使用call_once实现的单例模式std::mutex类--独占互斥锁成员函数std::recursive_mutex类--递归互斥锁使用注意:描述:std::timed_mutex类--超时互斥锁描述:成员函数:std::recursive_timed_mutex类std::lock_guard模板类函数原型:std::uniqu......
  • 【线程安全】线程互斥的原理
    文章目录Linux线程互斥线程互斥相关概念互斥量mutex引出线程并发问题引出互斥锁、互斥量互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁使用互斥锁抢票可重入和线程安全概念:常见线程不安全的情况常见线程安全的情况常见不可重入的情况常见可重入情况可重入与线......
  • 【操作系统】进程管理——进程的同步与互斥(个人笔记)
    学习日期:2024.7.8内容摘要:进程同步/互斥的概念和意义,基于软/硬件的实现方法进程同步与互斥的概念和意义为什么要有进程同步机制?回顾:在《进程管理》第一章中,我们学习了进程具有异步性的特征,即各个并发执行的进程以各自独立、不可预知的速度向前推进。但是,有的情况下,我们希......
  • 【Linux】多线程(互斥 && 同步)
    我们在上一节多线程提到没有任何保护措施的抢票是会造成数据不一致的问题的。那我们怎么办?答案就是进行加锁。目录加锁:认识锁和接口:初始化:加锁&&解锁:全局的方式:局部的方式:原理角度理解:实现角度理解:同步:加锁:认识锁和接口:初始化:这个就是我们互斥锁的类型。......
  • IO线程-同步、互斥、条件变量
    1.同步1.1概念同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情(异步:异步则反之,并非一定需要一件事做完再做另一件事。)1.2同步机制通过信号量实现线程间同步。信号量:通过信号量实现同步操作;由信号量来决定线程是继续运行还是阻塞等待.信......
  • 高编:线程(2)——同步与互斥
    一、互斥概念:   互斥===》在多线程中对临界资源的排他性访问。   互斥机制===》互斥锁 ===》保证临界资源的访问控制。   pthread_mutex_t mutex;   互斥锁类型       互斥锁变量内核对象框架:   定义互斥锁==》初始化锁=......
  • LINUX系统编程:多线程互斥
    目录1.铺垫2.线程锁接口的认识静态锁分配动态锁的分配互斥量的销毁互斥量加锁和解锁3.加锁版抢票4.互斥的底层实现1.铺垫先提一个小场景,有1000张票,现在有4个进程,这四个进程疯狂的去抢这1000张票,看看会发生什么呢?#include<iostream>#include<thread>#include......