1 基本原理
Celery 是一個異步任務隊列,能夠將耗時操作(如發郵件、處理圖片、網絡爬蟲等)從 Django 主線程中分離出來,由后臺的 worker 處理,避免阻塞請求。Celery 作為獨立運行的后臺進程(Worker),持續監聽消息隊列(Broker),接收并處理任務,而 Django 主線程用于發布任務。
Celery 是一種獨立于 Django 的程序,通常需手動啟動。它通過 Redis 等工具與主線程進行通信,并將任務進度和結果寫入數據庫,方便后續追溯。
基本流如下:
1.1 消息中間件 Broker
Django 和 Celery 通過消息中間件(Broker)進行通信,最常用的選擇是 Redis 或 RabbitMQ,因為它們速度快且穩定。如果可以接受安裝 Redis(在本地啟動只需一條命令),建議直接使用它。當然,還可以考慮其他替代方案。
以批處理為例,時序圖如下:
2 memory 方式實現
為了簡化步驟,我先測試了 memory 方法。
2.1 安裝 Celery
$ pip install celery
2.2 加入項目
- 創建?
myproject/my_celery.py
?文件,內容如下:
import os
from celery import Celeryos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')app = Celery('myproject') # 注意改成自己的 myproject 名app.conf.broker_url = 'memory://'
app.conf.result_backend = 'cache+memory://'app.autodiscover_tasks()
- 在?
myproject/__init__.py
?里加入:
from .my_celery import app as celery_app __all__ = ['celery_app']`
2.3 異步功能函數
添加異步功能:在應用的?tasks.py
?中定義任務:
from celery import shared_task@shared_task
def add(x, y):print(f"Adding {x} + {y}")return x + y
調用異步功能:
from myapp.tasks import addadd.delay(2, 3)
注意:由于 memory 維護不佳,建議直接使用 Redis。
3 redis 方式實現
3.1 使用 docker 方式安裝 redis
docker run -d --name redis-dev -p 6379:6379 redis
3.2 安裝 redis 包
pip install redis
3.3 修改代碼
替換設置部分:
app.conf.update(broker_url='redis://localhost:6379/0', # 如果在docker中使用,需要轉換成宿主機ipresult_backend='redis://localhost:6379/1',task_serializer='json',accept_content=['json'],timezone='Asia/Shanghai',enable_utc=True,
)
3.4 啟動 celery
一般情況下,需要手動啟動 celery 進程
celery -A your_project worker --loglevel=info