Django項目有一個耗時較長的update過程,但願在接到請求運行update過程的時候,Django應用仍能正常處理其餘的請求,而且update過程要求不能並行,也不能漏掉任何一個請求python
使用celery的solo模式解決git
https://github.com/microsoftarchive/redis/releasesgithub
下載.msi文件安裝,會直接將redis註冊爲windows服務redis
pip install celery pip indatll redis
# celery_test.py import time from celery import Celery app = Celery('tasks', broker='redis://127.0.0.1:6379/0') @app.task def add(x, y): time.sleep(5) return x + y
啓動celery服務django
celery -A celery_test.app worker --pool=solo -l info
查看完整的命令行參數列表windows
celery worker --help
對celery啓動命令的解釋api
'-A' 是一個全局配置,定義了APP的位置bash
'--pool' 是POOL的配置,默認是prefork(併發),選擇solo以後,發送的任務不會被併發執行,在worker執行任務過程當中,再次發送給worker的任務會排隊,執行完一個再執行另外一個併發
'-l' 是WORKER的配置,定義了log級別app
>>> from celery_test import add >>> add.delay(4,4)
由於啓動了solo模式,所以,能夠看到在一個add沒有執行完前,即便再次發送執行add的任務,celery worker也會等到前一個任務執行完纔去執行下一個
在裝載celery應用前先setup django
import time import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo.settings") django.setup() from celery import Celery from django_app.update import update app = Celery('tasks', broker='redis://127.0.0.1:6379/0', backend='redis://127.0.0.1:6379/0') @app.task def update_task(): update()
而後在views中調用task就能夠了。
from celery_test import update_task def update_api(request): if request.method == "GET": update_task.delay() return HttpResponse(status=status.HTTP_200_OK)
執行過程當中,程序的print信息會做爲celery warning,報錯信息會做爲celery error
在啓動應用的時候指定日誌文件路徑
-f log_path
不設置這個參數的時候,日誌默認輸出到控制檯