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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章