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

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

  

原文地址:https://www.cnblogs.com/qianzhengkai/p/10827364.html

时间: 2024-11-09 06:23:46

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

守护进程,模拟抢票例子,互斥锁,信号量,队列总结

 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 # 守护进程 from multiprocessing import Process import os,time,random def task(): print('%s

python—day29 守护进程、互斥锁、模拟抢票、IPC通信机制、生产者消费者模型

1.守护进程: 什么是守护进程,假如你是皇帝,每日每夜守护你的就是太监,守护进程就相当于太监,当皇帝驾崩后太监也需要陪葬,所以守护进程当父进程销毁时就一起销毁: 1 from multiprocessing import Process 2 3 import time 4 5 def task(name): 6 7 time.sleep(0.5) 8 print('%s' %name) 9 10 11 if __name__ == '__main__': 12 p = Process(targe

java多线程下模拟抢票

我们设置三个对象分别同时抢20张票,利用多线程实现. 1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票数 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 /* try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (Int

网络抢票synchronized同步票数(多线程,线程安全 )

编写 package com.Input_Output.I_O2; /** * 车站抢票 同步代码synchronized * @author zzh * */ public class Ticket { public static void main(String[] args) { //抢票的对象 User u=new User(); //同一个线程 Thread t1=new Thread(u,"小红"); Thread t2=new Thread(u,"小强"

Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态”的线程3. 终止线程的示例4. interrupted() 和 isInterrupted()的区别 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479949.html 1. interrupt()说明 在介绍终止线程的方式之前,有必要先对inter

7种创建线程方式,你知道几种?线程系列Thread(一)

前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对这方面还比较薄弱,这个时候就得好好补补了,这样才能加快提升自身能力的步伐,接下来的时间会着重讲解线程方面的知识.强势分割线. 话题乱入,一到跳槽季节想必我们很多人就开始刷面试题,这种情况下大部分都能解决问题,但是这样的结果则是导致有可能企业招到并非合适的人,当然作为面试官的那些人们也懒得再去自己出一

线程模拟买票

存在问题:这时候启动了四个线程,那么tickets是一个成员变量,也就是在一个线程对象中都维护了属于自己的tickets属性,那么就总共存在了四份. 解决方案一:tickets使用staitc修饰,使每个线程对象都是共享一份属性. 1.1 创建线程的方式二 创建线程的第二种方式.使用Runnable接口. 该类中的代码就是对线程要执行的任务的定义. 1:定义了实现Runnable接口 2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中 3:通过Thread类建立线

c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇(转)

这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都 知道,我们在访问网站时,是有两种方式的,POST和GET方式,HTTP协议是TCP/IP的一部分,有兴趣的可以使用Socket通讯可以模拟出 HTTP的访问机制.我们再说POST和GET方式,在访问一个页面时,浏览器会提交一个本地cookie提交到网站服务器,cookie的作用可以是保 存我们登陆网站成功后取得的一串钥匙,也可以是其他的一些重要的信息.这是至

编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TicketSaleCenter { public static void main(String[] args) { /* * 第6题: 编写三各类Ticket.SaleWindow.TicketSaleCenter分别代表票信息.售票