Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
今天的目標是帶你認識並實作兩個強大的工具:Celery 和 Redis,透過它們,我們可以將繁重的任務丟到背景執行,讓你的主應用保持流暢,也為未來的「定時排程」做好準備!
讓我們一步步從概念到實作,一起打造更高效的 Django 專案。
Celery 是一個功能強大的 非同步任務隊列(task queue) 框架,支援:
它與 Django 整合良好,可以讓你寫出如下這樣的任務:
@shared_task
def my_task():
print("這是一個非同步任務")
然後這個任務就能在背景被執行,而不會阻塞主線程。
Redis 是一個 記憶體資料庫與訊息中介(Message Broker),常被用來:
在 Celery 架構中,Redis 扮演「任務訊息的排隊者與轉送者」,它會暫存你丟進 Celery 的任務,等 Celery Worker 來取用:
Django 發送任務 → Redis 存放任務 → Celery Worker 執行任務
那我們就開始實際操作試試看:
pip install celery redis
docker-compose.yml
啟動 Redis安裝套件後,請將 docker-compose.yml
改為以下內容,這樣部署時也會啟動 Redis 、 Celery 跟定時器 :
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
container_name: django_web
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- mariadb
- redis
mariadb:
image: mariadb:11.7.2
container_name: my_mariadb
restart: always
environment:
MYSQL_DATABASE: my_database
MYSQL_USER: ptt_rag
MYSQL_PASSWORD: ptt_rag
MYSQL_ROOT_PASSWORD: root
ports:
- "3307:3306"
volumes:
- ./mariadb_data:/var/lib/mysql
redis:
image: redis:latest
container_name: my_redis
restart: always
ports:
- "6379:6379"
celery:
build:
context: .
dockerfile: Dockerfile
container_name: celery_worker
command: celery -A ptt_rag_dev worker -l info
volumes:
- .:/app
depends_on:
- mariadb
- redis
celery-beat:
build:
context: .
dockerfile: Dockerfile
container_name: celery_beat
command: celery -A ptt_rag_dev beat -l info
volumes:
- .:/app
depends_on:
- mariadb
- redis
明日預告【Day 10】使用 Celery + Redis 建立非同步排程 - 實作排程與背景任務執行
接下來會把 Celery 跟 Redis 的排程任務時作完成,敬請期待~