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,高级消息队列协议 ...
随机推荐
- WPF性能优化之UI虚拟化
@ 目录 前言 一.VirtualizingStackPanel 1.1 虚拟化功能介绍 1.在Window中添加一个ListBox控件. 2.在设计视图中用鼠标选中ListBox控件并右健依次单击& ...
- 深入理解JavaScript中的try catch finally
在日常开发中,我们经常使用try catch 来捕捉错误,来提升应用程序的健壮性,但是,大部分时候,只是惯性使用,很少静下来去深入理解一下try catch finally,所以本文将对try cat ...
- 『读书笔记』你不知道的JavaScript(上)
前言 文章只记录理解以及容易遗忘的知识点. 词法作用域.块作用域 词法作用域 词法作用域:简单的说,词法作用域就是定义在词法阶段的作用域.换句话说,词法作用域就是在你写代码时将变量和块作用域写在哪里来 ...
- Codes 开源研发项目管理平台——创新的敏捷测试解决方案
前言 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证.本地部署.全部功能开放,并且对 30 人以下团队免费.它通过整合迭代.看板.度量和自动化等功能,简化测试协同工作, ...
- Spring —— IoC入门案例
IoC入门案例 思路分析: 1.管理什么?(Service与Dao) 2.如何将被管理的对象告知IoC容器?(配置) 3.被管理的对象交给IoC容器,如何获取到IoC容器? ...
- [namespace hdk] Balanced_tree 整合
代码 #include<bits/stdc++.h> using namespace std; namespace hdk{ namespace balanced_tree{ const ...
- spring 拦截器实现token校验登录
pom文件 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</art ...
- Centos LNMP 安装日记
环境介绍 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) mysql8.0.12_b ...
- ROS基础入门——实操教程
ROS基础入门--实操教程 前言 本教程实操为主,少说书.可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记. Ruby Rose,放在这里相当合理 前言 ...
- const` 关键字位于函数签名的末尾
在 C++ 中,const 关键字可以应用于成员函数,表示该函数不会修改对象的成员变量. const 出现在 operator->() 成员函数的末尾,这意味着该成员函数在调用时不会修改对象的任 ...