1. 程式人生 > >非同步操作Celery的實現

非同步操作Celery的實現


celery:
使用場景:
主要用於做非同步
1. 解決一些耗時的操作(在原程序繼續執行的情況下,開一個新的程序執行比較耗時的程式,讓celery去做耗時的事情,給使用者一個快速地響應,跑完給一個訊號就可以了,不需要讓使用者等太長時間)
2. 定時執行某些任務 (網站天氣定時的更新)

celery中的名詞:
任務task: 就是一個python函式(要執行的耗時操作)
佇列queue: 將需要執行的任務加入到佇列中
工人worker: 開一個新的程序中,負責執行佇列中的任務
代理人borker: 負責排程,將任務加入到佇列queue中, 在佈置環境中一般使用redis

安裝celery包:
celery==3.1.25
celery-with-redis==3.0
djagno-celery==3.1.17

在django的setting檔案中新增app:
INSTALLED_APPS = [
    ...
    "djcelery",
]
同時在setting的末尾追加:
import djcelery
djcelery.setup_loader() 負責將任務加入佇列
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_IMPORTS = ('應用名稱.task')

然後在自己定義的應用的下面建立一個task.py檔案,用於放置需要非同步執行的任務,比如定義函式

遷移生成celery需要的資料表
python manage.py migrate

啟動Redis:
sudo redis-server /etc/redis/redis.conf

啟動worker:
python manage.py celery worker --loglevel=info

然後寫檢視函式和路由

呼叫語法:
在檢視函式中使用函式名.delay(如果有引數寫這裡)進行非同步呼叫


請求比較耗時一般有兩種解決方案:
1. 設快取,有些東西不能設定快取,比如定時重新整理天氣
2. 使用celery實現非同步celery