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
模組
__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模組
- 內容 在config.py檔案中寫入如下內容:
# -*- 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模組
- 內容 在tasks.py檔案中寫入如下內容:
# -*- 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模組
- 內容 在test.py檔案中寫入如下內容:
# -*- 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定時操作資料庫(努力編寫中。。。)