一、huey 库核心介绍
huey 是一款专为 Python 打造的轻量级任务队列库,核心用于处理异步任务、定时任务、延时任务,无需依赖复杂中间件即可快速实现任务调度。其原理是通过生产者提交任务、消费者监听执行,支持 Redis、SQLite 等多种存储方式。优点是轻量简洁、上手零门槛、依赖少,适合中小型项目;缺点是不适合超大规模分布式集群。该库采用 MIT 开源许可,可自由商用与修改。

二、huey 安装与基础环境配置
2.1 安装 huey
huey 安装极为简便,直接通过 pip 命令即可完成安装,打开命令行执行以下指令:
pip install huey若需要使用 Redis 作为存储后端(生产环境推荐),还需安装 Redis 依赖库:
pip install redis若是开发测试环境,可直接使用 SQLite 存储,无需额外安装其他依赖,开箱即用。
2.2 初始化 huey 实例
使用 huey 的第一步是创建任务队列实例,这是所有任务的核心载体,我们可以根据需求选择不同的存储方式。
2.2.1 基于 SQLite 的本地实例(测试专用)
SQLite 是文件型数据库,无需启动服务,适合本地开发、测试场景,代码如下:
from huey import SqliteHuey
# 初始化 SQLite 存储的 huey 实例,tasks.db 为任务存储文件
huey = SqliteHuey(filename='tasks.db')2.2.2 基于 Redis 的实例(生产环境推荐)
Redis 性能更高、支持并发,适合生产环境,配置代码:
from huey import RedisHuey
# 连接本地 Redis,默认端口6379,指定任务队列名称
huey = RedisHuey('my_task_queue', host='localhost', port=6379, db=0)初始化实例后,即可通过装饰器定义任务,无需复杂配置,这也是 huey 轻量便捷的核心体现。
三、huey 基础任务使用详解
3.1 定义并执行异步任务
异步任务是 huey 最基础的功能,用于处理无需立即返回结果、耗时较长的操作,比如发送邮件、生成报表、爬取数据等。通过 @huey.task() 装饰器即可将普通函数转为异步任务。
代码示例:基础异步任务
from huey import SqliteHuey
import time
# 初始化 huey
huey = SqliteHuey(filename='tasks.db')
# 定义异步任务
@huey.task()
def send_message(username, content):
"""模拟发送消息的耗时任务"""
time.sleep(2) # 模拟任务执行耗时
return f"用户 {username},消息:{content} 发送成功"
# 调用任务(非阻塞,立即返回)
task = send_message('张三', '你好,这是异步消息')
print("任务已提交,任务ID:", task.id)代码说明:
- 使用
@huey.task()装饰普通函数,函数逻辑不变,仅变为可异步执行的任务; - 直接调用函数不会立即执行,而是将任务存入队列,返回任务对象;
time.sleep(2)模拟耗时操作,主线程不会阻塞,可继续执行其他代码。
3.2 执行延时任务
延时任务用于指定延迟一段时间后再执行任务,比如订单超时未支付自动取消、延时发送通知等,使用 @huey.task(delay=秒数) 或调用时指定 delay 参数。
代码示例:延时任务
@huey.task(delay=5) # 延迟5秒执行
def delay_task(task_name):
"""延时执行任务"""
return f"延时任务 {task_name} 执行完成"
# 提交延时任务
delay_task('订单超时检查')
# 也可调用时动态指定延迟时间
delay_task('会员到期提醒').delay(10) # 延迟10秒执行代码说明:
delay参数单位为秒,可固定装饰器中,也可调用时动态传入;- 任务提交后会等待指定时间,再由消费者执行,无需手动计时。
3.3 定时周期任务
huey 支持定时周期任务,类似 Linux 的 Crontab,可实现每天、每小时、每分钟自动执行任务,比如每日数据统计、定时清理缓存等。
代码示例:周期任务
# 每分钟执行一次
@huey.periodic_task(crontab(minute='*'))
def minute_task():
print("每分钟执行一次的任务")
return "分钟任务执行完毕"
# 每天凌晨2点执行
@huey.periodic_task(crontab(hour=2, minute=0))
def daily_statistics():
print("每日凌晨2点执行数据统计任务")
return "每日统计完成"
# 每周一早上8点执行
@huey.periodic_task(crontab(day_of_week=1, hour=8, minute=0))
def weekly_remind():
print("每周一早上8点发送周报提醒")
return "周报提醒成功"代码说明:
- 使用
@huey.periodic_task装饰器定义周期任务,配合crontab控制执行时间; crontab支持分钟、小时、日期、月份、星期,语法与 Linux 定时任务一致;- 周期任务会由消费者自动调度,无需手动提交。
3.4 获取任务执行结果
提交任务后,可通过任务对象获取执行状态与结果,支持判断任务是否完成、获取返回值、取消任务等操作。
代码示例:获取任务结果
# 提交任务
result_task = send_message('李四', '测试获取任务结果')
# 判断任务是否执行完成
print("任务是否完成:", result_task.complete())
# 等待任务执行完成并获取结果(阻塞等待)
print("任务结果:", result_task.get(block=True, timeout=10))
# 取消任务(任务未执行时可取消)
# result_task.revoke()代码说明:
complete():返回布尔值,判断任务是否执行完毕;get(block=True):阻塞等待任务完成,timeout设置最大等待时间;revoke():撤销未执行的任务,适合任务提交后无需执行的场景。
四、huey 消费者启动与任务执行
huey 采用生产者-消费者模式,提交任务的是生产者,专门执行任务的是消费者,必须启动消费者才能执行队列中的任务。
4.1 启动消费者命令行
假设我们的任务代码保存在 task_app.py 文件中,启动消费者命令如下:
# 基础启动命令
huey_consumer.py task_app.huey -w 2命令参数说明:
task_app.huey:指定 huey 实例所在的模块与实例名;-w 2:启动 2 个工作进程,并发执行任务,可根据服务器性能调整;-l logs:将任务日志输出到 logs 目录,方便排查问题;-d:后台运行消费者(Linux/Mac 系统)。
启动成功后,命令行会显示消费者监听状态,提交的任务会自动被消费者获取并执行。
4.2 消费者运行逻辑
消费者启动后会持续监听任务队列,流程如下:
- 轮询检测队列中是否有待执行任务;
- 发现任务后,分配给工作进程执行;
- 执行完成后记录任务状态与返回结果;
- 周期任务会按设定时间自动触发执行。
整个过程无需人工干预,部署简单,适合中小型项目快速落地。
五、huey 高级功能使用
5.1 任务优先级设置
huey 支持为任务设置优先级,高优先级任务会优先被执行,适合区分核心任务与普通任务。
代码示例:优先级任务
# 高优先级任务
@huey.task(priority=10)
def high_priority_task(order_id):
time.sleep(1)
return f"高优先级订单 {order_id} 处理完成"
# 低优先级任务
@huey.task(priority=1)
def low_priority_task(log_id):
time.sleep(1)
return f"低优先级日志 {log_id} 记录完成"
# 提交任务
high_priority_task(1001)
low_priority_task(2001)代码说明:
优先级数值越大,执行优先级越高,消费者会优先调度高优先级任务。
5.2 任务异常处理与重试
执行任务时可能出现异常,huey 支持自动重试、异常捕获,保证任务稳定性。
代码示例:任务重试
# 执行失败自动重试3次,每次间隔2秒
@huey.task(retries=3, retry_delay=2)
def risky_task(num):
"""可能出错的任务"""
if num % 2 != 0:
raise ValueError("数字必须为偶数")
return f"数字 {num} 校验通过"
# 提交会报错的任务,触发重试
risky_task(3)代码说明:
retries=3:任务失败后自动重试 3 次;retry_delay=2:每次重试间隔 2 秒;- 重试次数耗尽仍失败,任务会标记为执行失败。
5.3 任务钩子函数
huey 支持任务执行前后的钩子函数,可用于记录日志、统计执行时间、预处理数据等。
代码示例:钩子函数
@huey.task()
def hook_task():
return "带钩子的任务"
# 任务执行前触发
@huey.pre_execute()
def pre_execute_hook(task):
print(f"任务 {task.id} 即将开始执行")
# 任务执行后触发
@huey.post_execute()
def post_execute_hook(task, result):
print(f"任务 {task.id} 执行完成,结果:{result}")代码说明:
钩子函数会自动绑定对应任务,无需手动调用,适合统一处理任务执行前后逻辑。
六、huey 实际业务场景案例
6.1 电商订单超时自动取消案例
电商场景中,用户下单后未支付,需超时自动取消订单并释放库存,这是 huey 延时任务的经典应用。
完整代码示例:
from huey import RedisHuey
import time
# 生产环境使用 Redis 存储
huey = RedisHuey('order_queue', host='localhost', port=6379, db=0)
# 模拟订单数据库
order_db = {
1001: {"status": "待支付", "stock": 10},
1002: {"status": "待支付", "stock": 5}
}
# 延时任务:订单15分钟未支付自动取消
@huey.task(delay=900) # 900秒=15分钟
def cancel_unpaid_order(order_id):
"""取消未支付订单,释放库存"""
order_info = order_db.get(order_id)
if not order_info:
return f"订单 {order_id} 不存在"
if order_info["status"] == "待支付":
order_info["status"] = "已取消"
order_info["stock"] += 1
return f"订单 {order_id} 超时未支付,已取消,库存已释放"
return f"订单 {order_id} 已支付,无需取消"
# 模拟用户下单
def create_order(order_id):
"""用户创建订单"""
if order_id in order_db:
print(f"订单 {order_id} 创建成功,15分钟内未支付将自动取消")
# 提交超时取消任务
cancel_unpaid_order(order_id)
return "下单成功"
# 测试下单
create_order(1001)
create_order(1002)业务逻辑说明:
- 用户创建订单后,立即提交 15 分钟延时任务;
- 若用户按时支付,订单状态变更,延时任务执行时不做操作;
- 若用户未支付,任务自动取消订单、释放库存,无需人工处理。
6.2 每日自动数据统计报表案例
结合周期任务,实现每日凌晨自动统计业务数据,生成报表并保存。
完整代码示例:
from huey import RedisHuey
from datetime import datetime
import json
huey = RedisHuey('stat_queue')
# 模拟业务数据
user_data = {"new_user": 120, "active_user": 850, "order_count": 320}
# 每日凌晨2点执行统计任务
@huey.periodic_task(crontab(hour=2, minute=0))
def generate_daily_report():
"""生成每日业务报表"""
report_data = {
"date": datetime.now().strftime("%Y-%m-%d"),
"new_user": user_data["new_user"],
"active_user": user_data["active_user"],
"order_count": user_data["order_count"],
"status": "success"
}
# 保存报表到文件
with open(f"daily_report_{datetime.now().strftime('%Y%m%d')}.json", "w", encoding="utf-8") as f:
json.dump(report_data, f, ensure_ascii=False, indent=4)
return f"每日报表生成成功:{report_data}"业务逻辑说明:
- 通过周期任务固定每日凌晨 2 点执行;
- 自动统计当日业务数据,生成 JSON 格式报表;
- 报表自动保存,无需人工登录系统操作,提升效率。
七、huey 项目部署与注意事项
- 存储选择:本地测试用 SQLite,生产环境必须用 Redis,提升性能与稳定性;
- 消费者守护:生产环境需用 supervisor、systemd 等工具守护消费者进程,防止崩溃退出;
- 并发控制:根据服务器 CPU 核心数设置工作进程数,避免过多进程导致服务器卡顿;
- 日志监控:开启任务日志,实时监控任务执行状态,及时排查失败任务;
- 适用场景:适合中小型项目、轻量级任务,大型分布式集群建议使用 Celery。
相关资源
- Pypi地址:https://pypi.org/project/huey/
- Github地址:https://github.com/coleifer/huey
- 官方文档地址:https://huey.readthedocs.io/
关注我,每天分享一个实用的Python自动化工具。

