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

Posted qianzhengkai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用开启线程的方式模拟抢票实现并加线程锁相关的知识,希望对你有一定的参考价值。

# -*- 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啦

  

以上是关于用开启线程的方式模拟抢票实现并加线程锁的主要内容,如果未能解决你的问题,请参考以下文章

Python 开启线程的2中方式,线程VS进程(守护线程互斥锁)

模拟多线程实现抢票

java并发线程锁技术的使用

Java中的多线程 模拟网络抢票代码

队列生产者消费者模型

多线程抢票系统浅析