• 用开启线程的方式模拟抢票实现并加线程锁


    # -*- coding: utf-8 -*-
    """
    主线程要等到所有非守护线程结束,才能结束。
    db.json----->{"count":1}
    """
    import json
    from threading import Thread, Lock
    import time
    
    
    def search(name):
        with open('db.json', 'rt', encoding='utf-8') as f:
            dic = json.load(f)
        time.sleep(1)
        count = dic['count']
        print('%s查看余票为%s' % (name, count))
    
    
    def buy(name):
        with open('db.json', 'rt', encoding='utf-8') as f:
            dic = json.load(f)
            if dic['count'] == 0:
                print('%s 余票为0啦' % name)
                return
            dic['count'] -= 1
            with open('db.json', 'wt', encoding='utf-8') as w:
                json.dump(dic, w)
            time.sleep(1)
            print('%s 购票成功' % name)
    
    
    def task(name, mutex):
        search(name) 
        mutex.acquire()  # 添加线程锁
        buy(name)
        mutex.release()  # 解除线程锁
    
    
    if __name__ == '__main__':
        mutex = Lock()  # 生成一个锁对象
        for i in range(1, 5):
            t = Thread(target=task, args=('用户%s' % i, mutex))
            t.start()
    
    
    # 用户2查看余票为1
    # 用户4查看余票为1
    # 用户3查看余票为1
    # 用户1查看余票为1
    # 用户4 购票成功
    # 用户2 余票为0啦
    # 用户3 余票为0啦
    # 用户1 余票为0啦
    

      

  • 相关阅读:
    Android动画系列
    Handler处理机制
    cp命令覆盖文件时不用按Y来确认的方法
    phantomjs
    无界面模式
    win10上安装keras
    MongoDB 排序
    MongoDB 条件操作符
    MongoDB 对象操作
    SQL 和 NoSQL 的区别
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/10827364.html
Copyright © 2020-2023  润新知