Django定時器Celery+Redis(一)Celery安裝使用
前言
開發Django也有一段時間了,在最近的專案遇到了需要使用定時器的需求:在每天的00:00需要對每個使用者的當天消費資料進行統計。這時候就需要用到定時任務,加上使用的Django開發,所以選擇了Celery。
Celery是一個基於python開發的分散式任務佇列框架,可以使用任務佇列的方式在分散式的機器上執行任務排程。譯名為:芹菜,不知道和分散式任務佇列MQ有何關聯。其主要包含:
- Broker:傳送和接收MQ佇列任務訊息的方案,常用是RabbitMQ和Redis,還有Amazon SQS、Zookeeper
- Workers:處理任務的苦力,每個worker就相當於一個程序,可以有很多個worker
- Beat:任務安排,制定任務,定時管理,可以理解為管理worker工作的
- Backend:儲存處理結果的後端
環境
- system:Ubuntu 16.04
- python:Python 3.5.2
- celery:4.2.0
- redis:2.10.6
安裝
sudo pip3 install celery==4.2.0
sudo pip3 install redis==2.10.6
安裝完以上環境後,預設安裝完Redis後便已開啟了Redis的服務,不過你還是可以用命令來啟動。
sudo redis-server
啟動成功後你會看到下面部分內容,意思是Redis服務已經在6379埠上準備好了,等待連線開工!
簡單使用
首先建立一個celery測試資料夾,然後在這個資料夾中建立一個tasks.py檔案和test.py檔案,目錄結構如下:
celery/
|-- __init__.py
|-- tasks.py
|-- test.py
from celery import Celery
# 建立Celery例項,我們稱之為Celery應用程式或簡稱app。這個例項是Celery中執行的所有操作的入口點,例如建立任務和管理工作程式
# 因此其他模組必須可以匯入它。第一個引數是Celery當前模組的名稱。第二個引數是broker關鍵字引數,指定要使用的訊息代理的URL。
# 這裡改為使用redis,預設使用的是RabbitMQ。
app = Celery('tasks', broker='redis://localhost:6379/0')
# 這裡定義了一個加法的任務,並使用@app.task來註冊任務
@app.task
def add(x, y):
return x + y
# 引入註冊的任務
from tasks import add
# 要排程celery任務,需要使用該delay()方法。這是排程任務的便捷快捷方式,apply_async()可以更好地控制任務執行:
add.delay(4, 5)
在celery目錄下(注意目錄不能錯,進入到新建的celery資料夾內)開啟終端,執行如下命令啟動worker:
sudo celery -A tasks worker -l info
sudo python3 test.py
回去看剛才的終端會出現,其中顯示了任務tasks.add執行的結果:
結語
至此,本篇博文基本結束了,簡單回顧一下過程,首先安裝好環境後啟動redis-server,然後建立celery資料夾編寫celery應用程式和任務tasks.py,再編寫執行任務排程的test.py檔案,啟動celery的worker(celery的苦力,一個程序,等待別人發起執行任務的命令),然後排程任務,執行test.py,讓worker工作,worker工作後得到結果4+5=9,這就是這個簡單使用的整個過程。
注意
1. 在執行sudo celery -A tasks worker -l info
的時候加上了sudo,原因是由於安裝celery的時候也加了sudo,所以celery是安裝在root使用者下,你當前的使用者就沒有celery,執行celery -A tasks worker -l info
可能會報bash: /usr/local/bin/celery: 沒有那個檔案或目錄
的錯誤。
2. sudo celery -A tasks worker -l info
的tasks指的是執行的module檔案的名字,不是建立celery例項的名稱(執行這個就會把tasks.py檔案當做module注入臨時的系統環境裡,這樣後面我們就可以匯入這個模組了from tasks import *
,所以下面的第三條匯入add函式的時候不會出錯)。也就是說把例項改為app = Celery('command', broker='redis://localhost:6379/0')
也是可以的。
3. 在test.py檔案中如果你在IDE中開啟celery目錄下的檔案發現from tasks import add
會報錯,不用管,執行不會出錯,在執行celery例項的時候tasks這個module已經註冊到臨時系統環境裡,我們現在可以在任意程序裡隨時使用這個module下的任何函式。
下一篇: Django定時器Celery+Redis(二)Celery配置及獨立