Python订单生成器+队列+异步提高性能和容错
以下代码实现了一个订单生成器,使用 asyncio 和 aioredis 库实现了高并发地生成订单,并将新增订单异步更新到数据库。具体实现流程如下:
初始化 OrderGenerator 类。传入 Redis 服务器地址和并发数,在初始化函数中设置并发数和一个订单队列,用于存储新生成的订单数据。
定义 generate_order() 方法。该方法使用 Redis 的 WATCH、MULTI 和 EXEC 命令实现事务操作,生成一个订单数据,并将其添加到订单队列和 Redis 缓存中。如果生成订单的过程中监视到订单号已被修改,则重试生成订单,直到生成成功。
定义 update_database() 方法。该方法从订单队列中获取一个订单数据,模拟将其异步更新到数据库的操作,并将更新完成的订单标记为完成。
定义 generate_orders() 方法。该方法在循环中尝试连接 Redis 服务器,如果连接成功则创建多个 generate_order() 协程任务和一个 update_database() 协程任务,等待所有订单生成任务完成后等待订单队列中的所有任务完成,然后取消 update_database() 协程任务并关闭 Redis 连接。如果连接失败,则重试连接,最多重试三次。
import time
import random
import asyncio
import aioredisclass OrderGenerator:def __init__(self, redis_url, num_concurrent=10):# 初始化函数,传入 Redis 服务器地址和并发数self.redis_url = redis_urlself.num_concurrent = num_concurrent# 初始化订单队列,用于存储新生成的订单数据self.order_queue = asyncio.Queue()async def generate_order(self, redis):# 生成订单的协程任务async with redis.pipeline(transaction=True) as pipe:while True:try:# 使用 WATCH 命令监视订单号是否被修改await pipe.watch('order_id')# 获取当前订单号并自增order_id = await pipe.incr('order_id')# 使用 MULTI 命令开始一个事务pipe.multi()# 生成订单数据order_data = {'order_id': order_id,'user_id': random.randint(1, 100),'total_price': random.randint(100, 1000),'create_time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}# 将订单添加到队列中await self.order_queue.put(order_data)# 将订单写入缓存await pipe.hmset(f'order:{order_id}', order_data)# 使用 EXEC 命令提交事务await pipe.execute()breakexcept aioredis.WatchError:# 如果订单号被修改,则重新尝试生成订单continueasync def update_database(self):# 将新生成的订单异步更新到数据库的协程任务while True:# 从订单队列中获取一个订单order_data = await self.order_queue.get()# 模拟将订单异步更新到数据库的操作await asyncio.sleep(1)print(f'订单 {order_data["order_id"]} 已更新到数据库')# 标记订单队列中的任务完成self.order_queue.task_done()async def generate_orders(self):retries = 0while retries < 3:# 与 Redis 服务器建立连接redis = await aioredis.Redis.from_url(self.redis_url)try:# 测试 Redis 服务器的可用性await redis.ping()# 创建并发数个生成订单的协程任务tasks = [asyncio.create_task(self.generate_order(redis)) for i in range(self.num_concurrent)]# 创建一个将新订单更新到数据库的协程任务update_task = asyncio.create_task(self.update_database())# 等待所有订单生成任务完成await asyncio.gather(*tasks)# 等待订单队列中的所有任务完成(即新订单更新到数据库)await self.order_queue.join()# 取消将新订单更新到数据库的协程任务update_task.cancel()# 关闭 Redis 连接redis.close()await redis.wait_closed()except (ConnectionError, TimeoutError):# 如果连接失败,则重试retries += 1print(f'Redis server is not available ({retries} retries)')redis.close()await redis.wait_closed()# 如果重试次数仍然失败,则抛出异常raise ConnectionError('Redis server is not available')if __name__ == '__main__':# 实例化 OrderGenerator 类,并运行生成订单的任务order_generator = OrderGenerator('redis://localhost', num_concurrent=10)asyncio.run(order_generator.generate_orders())相关文章:
Python订单生成器+队列+异步提高性能和容错
以下代码实现了一个订单生成器,使用 asyncio 和 aioredis 库实现了高并发地生成订单,并将新增订单异步更新到数据库。具体实现流程如下: 初始化 OrderGenerator 类。传入 Redis 服务器地址和并发数,在初始化函数中设置并发数和一…...
理德名人故事:全球投资之父-约翰.邓普顿
说到约翰‧邓普顿,我们就会想到他的很多标签。比如全球投资之父、史上最成功的基金经理等等。他是邓普顿集团的创始人,一直被誉为全球最具智慧以及最受尊崇的投资者之一。福布斯资本家杂志称他为"全球投资之父"及"历史上最成功的基金经理…...
微前端三:qiankun 协作开发和上线部署
我们先看qiankun怎么上线部署: 我这边用的是yaml 文件在 rancher上部署的: base是基座,这里每个应用都是一个服务,这个还是跟之前一样并没有区别,那如何在一个域名上挂载多个服务呢? 最开始我们主要是在in…...
HTML三叉戟,标签、元素、属性各个的意义是什么?
🌟🌟🌟 专栏详解 🎉 🎉 🎉 欢迎来到前端开发之旅专栏! 不管你是完全小白,还是有一点经验的开发者,在这里你会了解到最简单易懂的语言,与你分享有关前端技术和…...
prometheus获取kubelet接口监控数据
一、前言 k8s集群的kubelet服务内部有自带的cadvisor服务用于收集k8s集群的监控数据,所以可以通过调用kubelet的接口就能获取pod的资源监控数据,在新版本的k8s中,kubelet的监控数据获取端口为10250端口,老版本的是10255端口 二、…...
国产主控应用案例:汉王电子血压计-君正开发板
2023春季新品发布会上汉王科技发布柯氏音法电子血压计产品—汉王电子血压计,继嗅觉检测盒之后再次深度布局大健康领域。 不同于当前市面上使用示波法原理的电子血压计,汉王电子血压计采用血压测量金标准中的柯氏音法,由此引领一场电子血压计领…...
万宾科技智能井盖传感器特点介绍
当谈论城市基础设施的管理和安全时,井盖通常不是第一项引人注目的话题。然而,传统井盖和智能井盖传感器之间的差异已经引起了城市规划者和工程师的广泛关注。这两种技术在功能、管理、安全和成本等多个方面存在着显著的差异。 WITBEE万宾智能井盖传感器E…...
YoloV8改进策略:SwiftFormer,全网首发,独家改进的高效加性注意力用于实时移动视觉应用的模型,重构YoloV8
文章目录 摘要论文:《SwiftFormer:基于Transformer的高效加性注意力用于实时移动视觉应用的模型》1、简介2、相关研究3、方法3.1、注意力模块概述3.2、高效的加性注意力3.3、SwiftFormer 架构4、实验4.1、实现细节4.2、基线比较4.3、图像分类4.4、目标检测和实例分割4.5、语义…...
Jupyter Notebook在指定位置打开
1、在Jupyter Notebook设置文件中修改默认路径 anconda prompt输入: jupyter notebook --generate-config 找到配置文件路径:C:\Users\Lenovo.jupyter 打开文件,修改默认路径: ## The directory to use for notebooks and kernel…...
树控件的使用
目录 1、修改树控件的基础属性: 2、准备图标 : (1)、ico后缀的图片放入当前文件路径的rc中 (2)、在Icon中添加资源,导入图片 (3)、准备HICON图标 (4&am…...
C++实现顺序栈类的定义,编写main ()函数验证顺序栈类设计的合理性
C实现顺序栈类的定义,编写main ()函数验证顺序栈类设计的合理性 以下是一个简单的C代码示例,用于实现顺序栈类的定义并编写main()函数来验证其合理性: #include <iostream> using namespace std;const int MAX_SIZE 100; // 定义栈的…...
手机直播助手软件app哪个好用?
手机直播助手软件现在可谓是多如牛毛,从上半年魔棒手机自动直播软件上线以来。几乎全国所有的科技公司都效仿魔棒手机自动直播软件兴起手机直播助手开发热。相对来说,简单的手机直播助手软件没什么技术门槛。但是手机无人直播助手软件要做精做全则很难。…...
腾讯待办宣布关停,哪款待办事项提醒APP好?
如果你之前一直使用微信中的“腾讯待办”小程序来记录待办事项并设置定时提醒,那么你就会发现腾讯待办在2023年10月16日通过其官方微信公众号、小程序发布了业务关停公告,将于2023年12月20日全面停止运营并下架,并且有导出数据的提示。 腾讯…...
【单片机毕业设计】【hj-006-7】CO、有害混合气体检测 | 空气质量检测 | 有害气体检测
一、基本介绍 项目名: 基于单片机的CO、有害混合气体检测系统设计 基于单片机的空气质量检测系统设计 基于单片机的有害气体检测系统设计 项目编号:mcuclub-hj-006-7 单片机类型:STC89C52 具体功能: 1、通过MQ-7检测CO值&#x…...
wpf主页面解析
1、 开头的网址作用 1和2都是引入命名空间的,每一个字符串代表一系列的命名空间,这样就可以不用一个一个引用了。wpf中规定有一个名称空间是可以不加名字的,xmlns不加名字是默认命名空间。 "http://schemas.microsoft.com/winfx/2006/x…...
三相交错LLC软启动控制程序算法实现---充电桩电源设计实战细节
简介 充电桩充电终端是一款单枪最大功率达到600kW的充电桩。它具有以下特点: 充电枪线长3.5米,重量小于90kg,额定电压1000V,最大电流600A,最大功率600kW。 高宽深为1700340295mm。 该充电桩采用模块化设计,具有较高的可靠性和可维护性。 充电时间大约在30分钟左右,…...
Chrome 115之后的版本,安装和使用chromedriver
在Python中使用selenium 时报如下错误: 1. 老版本chrome对应的chromedriver 下载地址:CNPM Binaries Mirror 2. 新版本chrome对应的chromedriver 下载地址:Chrome for Testing availability...
潮玩宇宙:收藏、交流与竞技的数字乐园
最近爆火的新项目潮玩宇宙,想必有很多人入场了,代理商宣传投资147一个月回本,确实是现在做到了,现在平台一颗宝石的价格已经超过美金了,还有一大部分人在等待进场,潮玩宇宙旗下奖券世界和养猪农场已经做了有…...
企拓客app骗局为不实信息,企拓客保持正常经营状态
网络运营软件盛行,带来了一些混乱的现状,造成企业不同程度的损失,也让运营单位在选择软件时心有余悸。真真假假的信息,扰乱了运营软件的市场环境,热门的拓客软件不慎躺枪。企拓客就是其中之一。 笔者通过网上检索的方式,最终查证企拓客软件官方保持着正常运营,企拓客app骗局不攻…...
【性能】JDK和Jmeter的安装与配置
一、JDK环境配置 1. 下载JDK 官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html 选择对应系统的安装包,下载后安装,安装中记录JDK安装的地址,之后一直点击下一…...
Shell程序
Shell脚本定义:以.sh结尾的文件,用于执行特定任务脚本参数传递:执行脚本时可在命令后添加参数(如start/stop)Hadoop脚本示例:sbin/hadoop-daemon.sh start namenodeShell编程特点:简单易用,适合自动化常见操作脚本执行方式:直接运行.sh文件即可执行其中命…...
2026年6款AI驱动的人力系统测评:谁更适合科技企业
科技企业的人力系统选型,最怕两件事:一是业务长得太快,招聘、组织、薪酬、考勤各自上系统却连不起来;二是管理想用AI提效,最后只落成了几个零散功能。红海云、Moka、肯耐珂萨 KNX、钉钉、飞书、Workday覆盖了从招聘专精…...
Pytest参数化测试中文乱码?这2个隐藏技巧让你的测试报告清晰可读
Pytest参数化测试中文乱码?这2个隐藏技巧让你的测试报告清晰可读 在Python自动化测试领域,Pytest凭借其简洁的语法和强大的功能已成为开发者的首选工具。特别是它的参数化测试功能,能够高效验证多组输入数据下的代码行为。但当我们尝试用中文…...
在快马平台实战演练claude代码技能教程中的完整项目开发流程
今天想和大家分享一个特别实用的学习路径——如何通过InsCode(快马)平台将Claude代码技能教程中的知识转化为真实可运行的项目。最近我跟着教程完整实现了一个博客内容管理系统,整个过程比想象中顺畅很多。 项目规划与功能拆解 Claude教程中提到的博客系统包含8个…...
别再怕环路!手把手教你用锐捷RG-IS2700G交换机配置ERPS环网(附完整命令)
锐捷RG-IS2700G交换机ERPS环网实战:从零搭建高可靠企业网络 第一次接手企业园区网核心交换机的运维工作时,看到拓扑图上那个醒目的环形结构,我的手指在键盘上方悬停了整整十分钟——毕竟谁都不想成为"那个让全公司断网的新人"。直到…...
Air8101 搭载 RGB 直驱与 AirUI 适配工业电容屏开发
Air8101专为工业电容屏优化设计,RGB接口可直驱各类尺寸LCD电容屏,最高可支持1024*720分辨率屏,无需额外转接,大幅降低硬件开发成本。 一、硬件直驱: 目前正在支持完善:480*272分辨率:4.3寸屏800…...
接口隔离原则原理理解
01.前沿简单介绍学习了 SOLID 原则中的单一职责原则、开闭原则和里式替换原则,今天我们学习第四个原则,接口隔离原则。它对应 SOLID 中的英文字母“I”。对于这个原则,最关键就是理解其中“接口”的含义。那针对“接口”,不同的理…...
OpenText Static Application Security Testing (Fortify) 26.1 (macOS, Linux, Windows) - 静态应用安全测试
OpenText Static Application Security Testing (Fortify) 26.1 (macOS, Linux, Windows) - 静态应用安全测试 OpenText SAST 之前称为 Fortify SCA - 代码漏洞扫描工具 | 静态代码测试 | 代码安全分析 请访问原文链接:https://sysin.org/blog/opentext-sast/ 查看…...
无人机数据分析:UAV Log Viewer 技术解析与实践指南
无人机数据分析:UAV Log Viewer 技术解析与实践指南 【免费下载链接】UAVLogViewer An online viewer for UAV log files 项目地址: https://gitcode.com/gh_mirrors/ua/UAVLogViewer 无人机数据分析是提升飞行安全性和任务效率的关键环节。UAV Log Viewer作…...
新手零失败安装eNSP指南:用快马AI生成你的专属安装助手
新手零失败安装eNSP指南:用快马AI生成你的专属安装助手 最近在学习网络技术,第一步就是要安装华为的eNSP模拟器。作为一个纯新手,光是看到各种依赖组件就头大了:WinPcap、VirtualBox、Wireshark...更别提安装过程中可能遇到的各种…...
