Django定時器Celery+Redis(二)Celery配置和任務模塊化

序言

       在上一篇博客中記錄了Celery的安裝及初步簡單使用,如果需要請前往查看,本文在上一篇的環境基礎上繼續記錄Celery的配置使用及配置分離。前一篇博客的例子是將Celery的實例配置和任務都寫在了tasks.py的python文件中,這在多模塊任務或者大型項目(需要自定義很多的Celery配置)中就不太方便,我們把配置和任務及測試都分離出來,這樣我們要修改其中某一個配置就可以直接去配置文件中找。接下來我們將Celery的配置獨立於一個文件,任務也獨立於一個文件。
  
       再囉嗦一下安裝的環境版本:

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

文件目錄

       新建一個command文件夾(我的目錄爲/home/youjun/celery/command),其中的目錄結構如下:

celery/
|-- command/
|-- |-- __init__.py
|-- |-- application.py
|-- |-- config.py
|-- |-- tasks.py
|-- |-- test.py

       注意:官網中說明了在你先寫好的celery程序包下必須包含一個celery.py的文件,由於我們運行(ctr+alt+t打開終端,進入celery程序包所在目錄,例如我的是:cd /home/youjun/celery,然後執行啓動命令celery -A command worker --loglevel=info,command即爲我們寫好的celery程序包)的時候,celery會去尋找command下的celery.py模塊開始運行,如果沒有這個模塊,那麼就會報錯了。我們這裏沒有celery.py文件,那麼也有對應的解決辦法(後面說明)。

模塊

__init__模塊
  • 內容

       在__init__.py文件中寫入如下內容:

# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time    : 18-8-23 上午10:00
# @Author  : YYJ
# @File    : __init__.py.py
# @CopyRight: ZDWL
# ----------------------------------------------
import command.application as celery


__all__ = ('celery', 'config', 'tasks')

  • 說明

       前面說了在command下必須有一個celery.py模塊,我們這裏沒有,用的是application.py文件,然後我們可以通過第一行代碼把application取一個別名叫celery,這樣celery程序就能找到command下的celery模塊了(實際是application,當然你可以修改名字爲任意的了),如果不理解建議去看看Python的__init__.py文件和__all__的作用。

application模塊
  • 內容
           在application.py文件中寫入如下內容:
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time    : 18-8-23 上午10:05
# @Author  : YYJ
# @File    : app.py
# @CopyRight: ZDWL
# ----------------------------------------------
from __future__ import absolute_import
from celery import Celery


# 創建Celery實例,我們稱之爲Celery應用程序或簡稱app。這個實例是Celery中執行的所有操作的入口點,例如創建任務和管理工作程序
# 因此其他模塊必須可以導入它。
app = Celery()

# 配置配置文件
app.config_from_object('command.config')

  • 說明

       這一塊就兩點,一就是創建一個celery實例,二就是配置celery實例的配置文件,我們創建celery實例的時候不傳任何參數,我們只需要把所有的配置放在command下的config.py模塊中,然後通過app.config_from_object('command.config')告訴celery配置文件去使用command下的config.py模塊。

config模塊
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time    : 18-8-23 上午10:01
# @Author  : YYJ
# @File    : config.py
# @CopyRight: ZDWL
# ----------------------------------------------
# 配置代理
broker_url = 'redis://127.0.0.1:6379/0'
# 配置結果後端
result_backend = 'redis://127.0.0.1:6379/0'
enable_utc = False
# 配置時區
timezone = 'Asia/Shanghai'
# 配置需要導入的任務模塊
imports = ('command.tasks', )

  • 說明

       在這裏你可以配置你的配置參數,其中重要的是代理和任務的導入,我們使用redis(broker_url和result_backend參數)做結果後端,imports裏是我們需要導入的模塊,我們需要把我們的任務導入,所以必須在這裏對任務tasks模塊寫入imports配置,注意這裏全部都是小寫參數名,當然我們可以給參數加前綴(在下一篇博客中介紹)。

tasks模塊
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time    : 18-8-23 上午10:02
# @Author  : YYJ
# @File    : tasks.py
# @CopyRight: ZDWL
# ----------------------------------------------
from __future__ import absolute_import
from command.application import app


# 這裏定義了一個加法的任務,並使用@app.task來註冊任務
@app.task
def add(x, y):
    z = x + y
    print(z)
    return z

  • 說明

       這一塊就是你要執行的任務代碼了,這裏簡單定義了一個加法的任務(在具體的項目中,你可以改成你自己的任務,比如你可以在這裏寫一個統計數據庫中訂單今日的銷售總額的任務函數),內容不多,先從command.application導入我們創建的celery實例app,然後通過裝飾器@app.task將add函數註冊爲一個celery任務。
       現在是隻有一個task模塊,當我們任務比較多的時候也可以分離多個task模塊,實質就是在config中的imports中添加你要導入的任務,注意你的任務在系統環境中能找到,不然會報No module … 的異常,具體的多任務模塊在後面的博客再詳細點介紹。

test模塊
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time    : 18-10-19 下午2:50
# @Author  : YYJ
# @File    : test.py
# @CopyRight: ZDWL
# ----------------------------------------------
import sys


# 將路徑加入系統環境中
sys.path.append('/home/youjun/celery')
# 動態導入
tasks = __import__('command.tasks', fromlist=['add', ])

tasks.add.delay(4, 5)

  • 說明

       這裏有比較重要的東西,注意我的test.py是可以放在任意的地方運行的,原因在於我使用sys.path.append('/home/youjun/celery')將我寫的celery程序包command所在的路徑加到了系統環境中,這樣我們相當於把我們的command包臨時安裝到系統裏(這裏我說明一下,我們平時pip3安裝的一些包都在/usr/local/lib/python3.5/dist-packages下,比如我們安裝了celery對吧,那麼在這個目錄下就能找到celery目錄,那麼我們在導入的時候做了如此一個導入:from celery.apps.beat import Beat那麼是怎麼導入的呢,Python會從系統環境中所有的路徑中去找哪個目錄下有celery/apps/beat.py(beat.py裏還有Beat對象)目錄的,於是找到了完整目錄是/usr/local/lib/python3.5/dist-packages/celery/apps/beat.py如果找遍所有的環境都沒有找到,那麼就會報一個錯誤了,我們這裏使用sys.path.append('/home/youjun/celery')就是在這個程序運行期間把這個路徑也加入環境中也就是Python在這之後運行的時候也會在這個路徑下去找你的包或者模塊,那麼我們就可以使用Python動態導入我們的任務模塊了,這裏必須把這個路徑加入環境中,因爲我們動態導入的模塊中有from command.application import app,不導入的話是找不到command包的)。
       剩下的就是動態導入__import__的使用了,這裏不做解釋,不是本篇博客內容。最後一行代碼是調用任務。這個測試文件可以放在任何地方執行,前提是把你編寫的celery程序包的路徑如上加入環境中,我的爲/home/youjun/celery,需要改爲你自己的目錄,所以你的項目假設需要自己調用的話就可以派上用場。

運行測試

  • 運行celery

       進入你的celery程序包(我的爲command)所在目錄(我的爲),執行celery -A command worker --loglevel=info(command就是要運行的celery包名,改爲你自己的),執行結果如下:
在這裏插入圖片描述

  • 運行test模塊

       進入你的test.py所在目錄(我的爲/home/youjun/celery/command/),執行python3 test.py,結果如下:
在這裏插入圖片描述

  • 運行test後的結果

       最後執行了調用後的結果如下,可以看到打印的結果爲9:
在這裏插入圖片描述

結語

       到此celery的初配置及任務獨立,初步配置就結束了,講解的不少有些可能還不詳細,如有問題歡迎交流指正,原創文章不易,如有幫助到你請點個贊。在下一篇將會介紹celery配置和使用contab定時任務,以及結合django的ORM操作數據庫。

上一篇:Django定時器Celery+Redis(一)Celery安裝使用
下一篇:Django定時器Celery+Redis(三)Celery配置詳解及結合Django定時操作數據庫(努力編寫中。。。)

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