抢票小程序

抢票小程序

我们可以利用所学的内容来写一个简易的抢票小程序

from multiprocessing import Process
import json,time,os

def search():
    time.sleep(1) # 模拟网络io
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        res = json.load(f)
        print(f'还剩{res["count"]}')

def get():
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        res = json.load(f)
        # print(f'还剩{res["count"]}')
    time.sleep(1) # 模拟网络io
    if res['count'] > 0:
        res['count'] -= 1
        with open('db.txt',mode='wt',encoding='utf-8') as f:
            json.dump(res,f)
            time.sleep(1.5) # 模拟网络io
            print(f'进程{os.getpid()} 抢票成功')
    else:
        print('票已经售空啦!!!!!!!!!!!')

def task():
    search()
    get()

if __name__ == '__main__':
    for i in range(15):
        p = Process(target=task)
        p.start()
        p.join()
db.txt

{"count": 20}

抢票小程序(优化)

之前的抢票小程序看似完善但实际上在数据的安全方面依旧存在着问题,因此我们可以使用进程锁来实现优化

进程锁

进程锁的本质则是把锁住的代码变成串行,它可以用lock.acquire和lock.release来实现

lock.acquire:锁住

lock.release:释放锁头

优化的抢票小程序

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

def search():
    time.sleep(1) # 模拟网络io
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        res = json.load(f)
        print(f'还剩{res["count"]}')

def get():
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        res = json.load(f)
        # print(f'还剩{res["count"]}')
    time.sleep(1) # 模拟网络io
    if res['count'] > 0:
        res['count'] -= 1
        with open('db.txt',mode='wt',encoding='utf-8') as f:
            json.dump(res,f)
            print(f'进程{os.getpid()} 抢票成功')
        time.sleep(1.5) # 模拟网络io
    else:
        print('票已经售空啦!!!!!!!!!!!')

def task(lock):
    search()

    # 锁住
    lock.acquire()
    get()
    lock.release()
    # 释放锁头

if __name__ == '__main__':
    lock = Lock() # 写在主进程是为了让子进程拿到同一把锁.
    for i in range(15):
        p = Process(target=task,args=(lock,))
        p.start()
        # p.join()

    #  进程锁 是把锁住的代码变成了串行
    #  join 是把所有的子进程变成了串行

# 为了保证数据的安全,串行牺牲掉效率.

原文地址:https://www.cnblogs.com/jie9527-/p/11537470.html

时间: 2024-10-11 23:12:23

抢票小程序的相关文章

java多线程实现卖票小程序

1 package shb.java.demo; 2 /** 3 * 多线程测试卖票小程序. 4 * @Package:shb.java.demo 5 * @Description: 6 * @author shaobn 7 * @Date 2015-9-2下午7:49:53 8 */ 9 public class TestSyn { 10 public static void main(String[] args) { 11 //此注释为实现方式一 12 /*TicketDemo td = n

卖票小程序(二):解决Thread线程安全隐患!

第二篇文章内容 class Ticket implements Runnable//extends Thread//实现Runnable接口 { public int tic = 100; Object obj = new Object(); public void run() { while(true)//默认为真 { synchronized(obj)//同步代码块 { if(tic>0) {//如果票数大于0则执行如下代码. try {Thread.sleep(10);} catch (E

对于JAVA多线程卖票小程序的理解

昨天把多线程重新看了一遍,发现自己还是有许多需要理解的地方,现在写一篇总结. 一:利用继承Thread类会出现的问题: public class SellTicketsThread extends Thread { private int tickets = 10; public SellTicketsThread(String name) { super(name); } @Override public void run() { while (true) { if(tickets<=0) b

python爬虫学习之用Python抢火车票的简单小程序

利用Python制作自动抢火车票小程序,过年再也不要担心没票了! 前言 每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年! 我本来想自己写一个练练手的,但是转眼一想,Python 本身最大的优势是什么,不就是有很多牛逼的人已经造好轮子了吗?你只需要知道这些轮子并会使用就行了,这样会节省你大量的精力和时间,而且站在巨人的肩膀上,会看得更远.于是我在 github 上一搜索,果然有不少抢票程序,有的是 Python2

大麦网抢票工具系列(一)

前言 <大麦网>都知道吧,就是那个被网友声称"大麦网你卖啥了?"票务平台.近期有听到朋友说<大麦网>的票很难抢,基本上都是说:"哎哟喂,被挤爆啦,请稍后重试!",也不知道<大麦网>到底有没有票!!! 言归正传,准备做个<大麦网>抢票的软件,就是想证明下<大麦网>到底有没有票(推广公众号)!!,做之前也从百度.Github里面搜索过, Github里面有几个好用的Python抢票脚本,有兴趣的可以去里面搜索.

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

[转]简单的Python 火车抢票程序

当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你想要的火车票信息!如果你刚掌握了Python基础,这将是个不错的小练习. 接口设计 一个应用写出来最终是要给人使用的,哪怕只是给你自己使用.所以,首先应该想想你希望怎么使用它?让我们先给这个小应用起个名字吧,既然及查询票务信息,那就叫它tickets好了.我们希望用户只要输入出发站,到达站以及日期就让就能获得想要的信息,所以

进程对象的其他方法、守护进程、使用多进程实现 socket tcp协议 server端的并发(抢票程序)、队列、进程之间的通信(IPC)

# 进程对象的其他方法 from multiprocessing import Process import time class MyProcess(Process): def __init__(self, a, b): # 为了给子进程传递参数 super().__init__() self.a = a self.b = b def run(self): print("子进程开始执行") time.sleep(2) print("子进程结束", self.a,

前端微信小程序电影类仿淘票票微信小程序

需求描述及交互分析 设计思路和相关知识点 电影界面顶部页签切换效果设计 正在热映界面布局设计 即将上映界面布局设计 电影详情页设计 我的界面列表导航设计 登录设计 相关知识点 (1)swiper滑块视图容器组件,可以实现海报轮播效果动态展示以及页签内容切换效果: (2)wx.request(OBJECT)是用来发起的是 HTTPS 请求: (3)微信小程序支持页面分享功能,可以把指定页面分享给好友或者群,需要使用onShareAppMessage 函数,设置该页面的分享信息: (4)wx.set