1. 程式人生 > >Django定時器Celery+Redis(一)Celery安裝使用

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:儲存處理結果的後端

環境

       本小節先記錄Celery的初步使用,其中我的環境為:

  • system:Ubuntu 16.04
  • python:Python 3.5.2
  • celery:4.2.0
  • redis:2.10.6

安裝

       

由於我是基於Python3開發,所以安裝都使用pip3,我將Redis作為Broker服務,雖然Celery官方更建議使用RabbitMQ,但我這裡選用Redis,這裡沒有安裝Celery與Redis的連線包celery-with-redis,完全可行,暫時就不安裝使用了。

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

       然後在tasks.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

       在test.py中新增如下程式碼:

# 引入註冊的任務
from tasks import add

# 要排程celery任務,需要使用該delay()方法。這是排程任務的便捷快捷方式,apply_async()可以更好地控制任務執行:
add.delay(4, 5)

       在celery目錄下(注意目錄不能錯,進入到新建的celery資料夾內)開啟終端,執行如下命令啟動worker:

sudo celery -A tasks worker -l info

       不出意外會得到如下執行結果:

這裡寫圖片描述

       再開一個終端,同樣進入celery目錄,執行如下:

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配置及獨立