Huey 是純 Python 實作的輕量任務佇列,依賴 Redis 作為後端,支援多執行緒執行、排程任務(crontab)、週期性任務、失敗重試、結果儲存,無需 Celery 的繁重依賴,適合中小型專案快速導入非同步處理。
pip install huey redis
三大核心元件:
@huey.task()、@huey.periodic_task(crontab(...))。huey_consumer.py 持續輪詢佇列執行任務。from huey import RedisHuey
huey = RedisHuey('my-app', host='localhost', port=6379)
from config import huey
@huey.task()
def add_numbers(a, b):
return a + b
@huey.periodic_task(crontab(minute='0', hour='3'))
def nightly_backup():
sync_all_data()
from config import huey
from tasks import add_numbers
if __name__ == '__main__':
result = add_numbers(10, 20) # 非同步送入,回傳 AsyncData
print(f"任務已送入,結果: {result.get()}") # 阻塞等待結果
# 或排程延遲執行
add_numbers.schedule(args=(5, 5), delay=60) # 60秒後執行
huey_consumer.py config.huey -w 4 -l /var/log/huey.log
-w 4:4 個工作執行緒。-l:日誌檔案。-p:啟用週期性任務排程執行緒(預設開啟)。from huey.backends.redis_backend import RedisDataStore
result_store = RedisDataStore('results', host='localhost', port=6379)
huey = RedisHuey('my-app', result_store=result_store)
@huey.task(retries=3, retry_delay=10)
def flaky_task():
if random.random() < 0.7:
raise Exception('暫時性失敗')
return '成功'
result = add_numbers.schedule(args=(100,), delay=300)
result.revoke() # 取消尚未執行的任務
Huey 本身不內建優先級佇列,可透過多個 Huey 實例對應不同 Redis List 實現。
| 特性 | Huey | Celery | RQ |
|---|---|---|---|
| 依賴 | Redis + 標準庫 | Broker (Redis/RabbitMQ) + 多套件 | Redis |
| 程式碼量 | 極小 (~2000 行) | 龐大 | 中等 |
| 功能豐富度 | 核心功能完備 | 極豐富(Canvas、Chord、監控等) | 基礎功能 |
| 學習曲線 | 平緩 | 陡峭 | 平緩 |
| 適用規模 | 中小專案、微服務 | 大型分散式系統 | 中小專案 |
Huey 以「輕量、零額外依賴、API 直觀」為核心優勢,是 Python 專案導入非同步任務的優質選擇。