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())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Django 03】QuerySet 和 Instance应用

1. DRF QuerySet 和 Instance功能概述 1.1 QuerySet 从数据库中查询结果存放的集合称为 QuerySet。 Django ORM用到三个类&#xff1a;Manager、QuerySet、Model。每个Model都有一个默认的 manager实例&#xff0c;名为objects。Django的ORM通过Mode的objects属性提供各种数据…

Java 常用类(包装类)

目录 八大Wrapper类包装类的分类 装箱和拆箱包装类和基本数据类型之间的转换常见面试题 包装类方法包装类型和String类型的相互转换包装类常用方法&#xff08;以Integer类和Character类为例&#xff09;Integer类和Character类的常用方法 Integer创建机制&#xff08;面试题&a…

划词搜索IP插件

插件背景 浏览器插件可以让用户根据个人工作及日常需求来定制浏览器的功能和界面。当用户在网页上看到一些IP地址时&#xff0c;或许会好奇它们的来源和归属。传统的做法是&#xff0c;用户需要复制这个IP地址&#xff0c;然后跳转到埃文科技旗下的http://IPUU.net网站进行查询…

基于Java的考研信息查询系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Flink SQL 时区 -- 时间字符串转时间戳并转换时区

文章目录 一、数据需求&#xff1a;二、探索路程1、UNIX_TIMESTAMP CONVERT_TZ2、UNIX_TIMESTAMP 三、解决方案TIMESTAMPADD TO_TIMESTAMP 一、数据需求&#xff1a; 将时间字符串格式化&#xff0c;转变成时间戳&#xff0c;再加8小时后写入clickhouse 2023-10-17T03:00:4…

速卖通测评补单的条件和步骤

速卖通测评补单对于卖家来说是一种低成本、高回报的推广营销方式&#xff0c;可以提高商品的流量、转化率、关键词质量分和链接权重。但是如果处理不当&#xff0c;可能会对店铺产生负面影响。下面是实现自养号给自己店铺测评的条件和步骤&#xff1a; 1. 稳定的测评环境系统 …

使用 OpenSSL 扩展来实现公钥和私钥加密

首先&#xff0c;你需要生成一对公钥和私钥。可以使用 OpenSSL 工具来生成&#xff1a; 1、生成私钥 openssl genpkey -algorithm RSA -out private_key.pem 2、从私钥生成公钥&#xff1a; openssl rsa -pubout -in private_key.pem -out public_key.pem现在你有了一个私钥…

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…

react配置 axios

配置步骤&#xff08;基本配置&#xff09;&#xff1a; 1.安装 axios cnpm install axios --save2.src/utils 新建一个 request.js文件(没有utils就新建一个目录然后再建一个request.js) 3.request代码如下&#xff1a; 这个是最简单的配置了&#xff0c;你可以根据自己的需…

链表的概念+MySingleList的实现

文章目录 链表一、 链表的概念1.概念2. 结构 二、MySingleList的实现1 .定义内部类2 .创建链表3. 遍历链表并打印4.查找单链表中是否包含关键字key5.得到链表的长度6.头插法7. 尾插法8.任意位置插入8.删除结点清空 链表 顺序存储&#xff1a;顺序表/ArrayList 优点&#xff1…

【数据库范式】实际案例分析

前言 在日常业务研发过程中&#xff0c;我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则&#xff0c;对于数据表的设计范式&#xff0c;我们特别容易忽略它的存在。很多时候&#xff0c;当数据库运行了一段时间之后&#xff0c;我们才发现数据表设计上有问题。然…

前端--性能优化【1】--网络优化与页面渲染优化

一、网络优化 1、DNS预解析 link标签的rel属性设置dns-prefetch&#xff0c;提前获取域名对应的IP地址 2、CDN&#xff08;网络分发系统&#xff09; 用户与服务器的物理距离对响应时间也有影响。 内容分发网络&#xff08;CDN&#xff09;是一组分散在不同地理位置的 web…

linux常见命令-文件目录类

9.4 文件目录类 &#xff08;1&#xff09;pwd 指令:显示当前工作目录的绝对路径 &#xff08;2&#xff09;Is指令:查看当前目录的所有内容信息 基本语法&#xff1a; ls [选项,可选多个] [目录或是文件] 常用选项:-a:显示当前目录所有的文件和目录&#xff0c;包括隐藏的…

钢铁异常分类 few-shot 问题 小陈读paper 钢铁2

很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习&#xff0c; 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…

C++入门(c++历史篇)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 重点 1. 什么是C2. C的发展…

RTOS(6)任务管理

任务状态理论 我们是怎么实现&#xff0c;两个同优先级的任务之间交替执行的呢&#xff1f; 任务切换的基础&#xff1a;tick中断&#xff01; tick为1ms一个周期&#xff0c;可以通过修改时钟配置修改&#xff1b; running&#xff1a;正在进行的任务3为running&#xff…

`SQL`编写判断是否为工作日函数编写

SQL编写判断是否为工作日函数编写 最近的自己在写一些功能,遇到了对于工作日的判断,我就看了看sql,来吧!~(最近就是好疲惫) 我们一起看看(针对ORACLE) 1.声明: CREATE OR REPLACE PACKAGE GZYW_2109_1214.PKG_FUN_GETDAY_HDAY AS /** * 通过节假日代码获取指定的日期[查找基…

深入鸿蒙开发-OpenHarmony高性能开发的三位一体

OpenHarmony LazyForEach ArkUI 高性能 OpenHarmony应用性能优化概览 核心思想 我们相信时间以线性存在&#xff0c;它持续不变地进行&#xff0c;直到无穷无尽。 但过去、现在和未来的不同&#xff0c;昨日、今日和明日可能不是连贯的&#xff0c;而是互相组合的永无止尽的循环…

android查漏补缺(6)android相关属性

一、Android相关属性的介绍 1.android:exported true 在Activity中该属性用来标示&#xff1a;当前Activity是否可以被另一个Application的组件启动&#xff1a;true允许被启动&#xff1b;false不允许被启动。

Java学习之Java基础部分知识点

Java基础 一、Java语言具有哪些特点&#xff1f; Java为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性。java利用Java虚拟机运行字节码&#xff0c;无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译&#xff0c;编译后的程序可在其它平台运…