缘起:

之前在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

使用:

  1. 配置Huey实例。

  2. 使用@huey.task()装饰器来标记要执行的任务。

  3. 在你的应用程序中调用该任务,它将被添加到任务队列中。

  4. 运行一个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的更多相关文章

  1. python消息队列snakemq使用总结

    Python 消息队列snakemq总结 最近学习消息总线zeromq,在网上搜了python实现的消息总线模块,意外发现有个消息队列snakemq,于是拿来研究一下,感觉还是很不错的,入手简单使用也 ...

  2. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  3. Python消息队列(RabbitMQ)

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用.可维护多个队列,可实现消息的一对一和广播等方式发送 RabbitMQ是一个开源的AMQP实现 ...

  4. python - 消息队列

    消息队列分类 1.先进先出 2.后进先出 3.优先级队列 4.双向队列 1.先进先出 import queue q = queue.Queue(2) #队列最大长度 q.put(11) q.put(2 ...

  5. python消息队列Queue

    实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...

  6. python 消息队列-rabbitMQ 和 redis介绍使用

    1.rabbitMQ 与ptyhon 进程queue 区别.进程queue 主要用户Python父子进程之间或者统一进程不同子进程.rabbit可以用户不同语言之前的相互交流,socket可以实现同样 ...

  7. python之消息队列

    引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...

  8. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  9. python 操作消息队列

    图示 其中P指producer,即生产者:C指consumer,即消费者.中间的红色表示消息队列,实例中表现为HELLO队列. 往队列里插入数据前,查看消息队列 $sudo rabbitmqctl l ...

  10. python【第十一篇】消息队列RabbitMQ、缓存数据库Redis

    大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...

随机推荐

  1. C++源码中司空见惯的PIMPL是什么?

    前言: C++源码中司空见惯的PIMPL是什么?用原始指针.std::unique_ptr和std::shared_ptr指向Implementation,会有什么不同?优缺点是什么?读完这篇文章,相 ...

  2. .NET Core搭配Vue开源弹幕效果,实现一个评论小项目。好玩!

    ZY树洞 前言 ZY树洞是一个基于.NET Core开发的简单的评论系统,主要用于大家分享自己心中的感悟.经验.心得.想法等. 好了,不卖关子了,这个项目其实是上班无聊的时候写的,为什么要写这个项目呢 ...

  3. 宝塔安装onlyoffice

    1. 拉取镜像 docker pull onlyoffice/documentserver 2. 构建容器 进入宝塔管理面板->docker->镜像,可以看到镜像已被安装成功 配置容器参数 ...

  4. 全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

    全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback 摘要: 回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法.这种模式在 Pyt ...

  5. SpringCloud入门(二)服务间调用和案例

    一.微服务拆分注意事项微服务拆分注意事项:1.单一职责:不同微服务,不要重复开发相同业务2.数据独立:不要访问其它微服务的数据库3.面向服务:将自己的业务暴露为接口,供其它微服务调用 1.微服务需要根 ...

  6. ASP.NET Core Library – Google libphonenumber (Country Dial Code)

    前言 Google libphonenumber 是 Java 的, ASP.NET Core 只是 port 过去而已. 以前在 angular2 学习笔记 ( translate, i18n 翻译 ...

  7. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  8. “RazorTagHelper”任务意外失败。解决方案

    严重性    代码    说明    项目    文件    行    禁止显示状态错误    MSB4018    "RazorTagHelper"任务意外失败.System.I ...

  9. Maven高级——依赖管理

    依赖管理 依赖指向当前项目运行所需的jar包,一个项目可以设置多个依赖 依赖传递 依赖具有传递性 直接依赖:在当前项目中通过依赖配置建立的依赖关系 间接依赖:被依赖的资源如果依赖其他资源.当前项目间接 ...

  10. Spring —— bean生命周期

    bean生命周期 生命周期:从创建到消亡的完整过程 bean生命周期:bean从创建到销毁的整体过程 bean生命周期控制:在bean创建后到销毁前做一些事情   方式一:配置控制生命周期 <b ...