Python消息队列之Huey
缘起:
之前在Python中使用最多的就是Celery, 同样的在这次项目中使用了Celery+eventlet的方式,但是由于具体执行的逻辑是使用的异步编写的, 当时就出现了一个问题,当使用httpx的AsyncClient发送一个网络请求的时候, 发生了阻塞, 导致整个程序无法完整执行. 于是就找替代方案, 于是这次就尝试使用了huey,最终可以实现, 但是为何Celery中执行会发生阻塞,Google中也有大佬提到了
github: https://github.com/coleifer/huey
特点:
- 简单
- 轻量
- 执行多种类型: redis,sqlite,file,memory
安装:
pip install huey
# 将redis作为队列broker
pip install redis
使用:
配置Huey实例。
使用
@huey.task()装饰器来标记要执行的任务。在你的应用程序中调用该任务,它将被添加到任务队列中。
运行一个worker来监听队列并执行任务。
task.py
from huey import RedisHuey
from redis import ConnectionPool redis_pool = ConnectionPool(host='127.0.0.1', port=6379, db=10, password="密码")
huey = RedisHuey('app', connection_pool=redis_pool) @huey.task()
def count_beans(num):
for i in range(num):
print(i)
time.sleep(3)
return 'count beans'
启动消费者:
huey_consumer task.huey -k process -w 4 # windows下
huey_consumer.exe task.huey -k process -w 4 # -k: 指定worker类型, thread(默认), greenlet, process(windows下不支持)
# -w: 指定worker的数量, 同时有多少个消费者同时工作 # 还有其他的一些参数, 可以使用--help查看
# -l: 指定日志文件
# -v: 显示日志
主业务,将任务投递到队列中main.py
from task import count_beans if __name__ == '__main__':
res = count_beans(10)
print(res)
重试任务&定时任务
# tasks.py
from huey import RedisHuey, crontab
import logging
import time # 配置huey实例
huey = RedisHuey('my_app', host='localhost') # 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) # 一个简单的任务
@huey.task()
def add_numbers(a, b):
logger.info("Adding numbers: {} + {}".format(a, b))
return a + b # 带有失败重试的任务
@huey.task(retries=3, retry_delay=10)
def flaky_task():
logger.info("Trying to perform a flaky task...")
if random.choice([True, False]):
raise ValueError("Oops! Something went wrong.")
else:
logger.info("Flaky task succeeded.") # 定时任务:每天执行
@huey.periodic_task(crontab(minute='0', hour='3'))
def daily_task():
logger.info("Running daily task.")
# 执行一些需要每天运行的操作 # 以下代码是模拟的任务使用案例,在实际应用程序中通常不会包含在任务定义的模块中 # 模拟任务队列和执行
if __name__ == '__main__':
import random
# 模拟添加任务到队列
for i in range(10):
add_numbers(i, i*2) # 模拟执行任务队列中的任务
for _ in range(10):
flaky_task() # 模拟定时任务的调用,实际情况下应该由huey的调度器执行
daily_task() # 这里我们模拟启动worker,实际上应当通过命令行启动
# 命令:`huey_consumer.py tasks.huey`
# 以下代码将会启动一个循环,模拟worker的行为
while True:
time.sleep(1)
huey.flush()
注意点: 这里的定时任务,会使用自己的一个调度频率, 例如,每分钟执行, 并不是每分钟的0秒开始执行, 而是根据程序执行的时候,并且启动的时候会执行一次
整体使用感受,轻量,快速,清爽,还会有终端的时候,优雅处理方式
当然还有更多工具可以使用
Rq:
https://github.com/rq/rq
Mrq:
https://github.com/pricingassistant/mrq
Python消息队列之Huey的更多相关文章
- python消息队列snakemq使用总结
Python 消息队列snakemq总结 最近学习消息总线zeromq,在网上搜了python实现的消息总线模块,意外发现有个消息队列snakemq,于是拿来研究一下,感觉还是很不错的,入手简单使用也 ...
- Python消息队列工具 Python-rq 中文教程
原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...
- Python消息队列(RabbitMQ)
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用.可维护多个队列,可实现消息的一对一和广播等方式发送 RabbitMQ是一个开源的AMQP实现 ...
- python - 消息队列
消息队列分类 1.先进先出 2.后进先出 3.优先级队列 4.双向队列 1.先进先出 import queue q = queue.Queue(2) #队列最大长度 q.put(11) q.put(2 ...
- python消息队列Queue
实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...
- python 消息队列-rabbitMQ 和 redis介绍使用
1.rabbitMQ 与ptyhon 进程queue 区别.进程queue 主要用户Python父子进程之间或者统一进程不同子进程.rabbit可以用户不同语言之前的相互交流,socket可以实现同样 ...
- python之消息队列
引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- python 操作消息队列
图示 其中P指producer,即生产者:C指consumer,即消费者.中间的红色表示消息队列,实例中表现为HELLO队列. 往队列里插入数据前,查看消息队列 $sudo rabbitmqctl l ...
- python【第十一篇】消息队列RabbitMQ、缓存数据库Redis
大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...
随机推荐
- 严蔚敏 数据结构 配套教材 PDF
目录 严蔚敏 数据结构 配套教材 PDF 下载地址: 严蔚敏 数据结构 配套教材 PDF 配套教材包括: 严蔚敏<数据结构题集>(C语言版).pdf 严蔚敏<数据结构>(C语言 ...
- 【YashanDB知识库】数据库使用shutdown immediate无响应导致coredump
[标题]数据库使用shutdown immediate无响应导致coredump [问题分类]数据库维护 [关键词]YashanDB, shutdown immediate, coredump [问题 ...
- EF Core报错“Format of the initialization string does not conform to specification starting at index 0.”
问题分析: 今天在EF Core数据库迁移的过程中无意中发现此错误,我的项目仅仅复制黏贴了配置文件而已,自此发现是数据库配置文件json在作祟. 对比了下发现是.json文件没有被设置"复制 ...
- Locust 进行分布式负载测试
什么是 Locust Locust 是一个开源的负载测试工具,用于测试网站和其他应用程序的性能.它通过编写 Python 脚本来定义虚拟用户的行为,模拟这些用户对目标系统发起请求.Locust 提供了 ...
- SQL Server 中的 NUL 设备/NIL设备
SQL Server 中的 NUL 设备/NIL设备 在 SQL Server 中,有一个特殊的设备叫做 NUL(注意,不是 NULL),它类似于文件系统中的"黑洞".NUL 设备 ...
- 前端项目通过 Nginx 发布至 Linux,并通过 rewrite 配置访问后端接口
〇.前言 本文通过将 arco 框架的前端项目,部署至 CentOS 7,并访问同服务器的 WebAPI 接口,来简单演示一下,如何将前端项目发布至 Linux 系统. 关于 ASP.NET WebA ...
- VS(visual studio) C++ 封装dll,以及其隐式调用与显式调用(静态\动态)
DLL介绍 DLL(动态链接库,Dynamic Link Library)是一种可执行文件,它包含可以在其他程序中调用的函数和数据.他是Windows操作系统中的一个重要概念,用于代码共享和模块化. ...
- 痞子衡嵌入式:如果i.MXRT离线无法启动,试着分析ROM启动日志
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT系列MCU的ROM启动日志. 关于 i.MX RT 启动问题解决的文章,痞子衡写过非常多,其中大部分都是具体到某一类启 ...
- 线段树与离散化技巧 Mayor's posters——poj 2528
问题描述: 有一堵海报墙,从左到右一共有10000000个小块,墙上贴了许多海报,每张海报的高度与墙的高度相同,宽度不同,新帖的海报会将原有的海报覆盖,问当所有人把海报贴完是,墙上可以看到几张海报 输 ...
- SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用
SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用.主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能 ...