Django與Celery是基于Python進行Web后端開發(fā)的核心搭配,在運營開發(fā)(即面向企業(yè)內(nèi)部)的場景中非常常見。
下面是基于Django的Celery異步任務和定時任務的實戰(zhàn)教程,大家覺得有用的話點個贊/在看吧!
1.配置Django Celery
配置celery主要有幾點:
- 在settings.py的同級目錄下,創(chuàng)建celery.py文件(名字自己隨意取),這個文件主要是用來生成celery的實例app.

我們將 celery 實例的 broker 和 backend 都設為了redis.
其中 broker 的意思是“經(jīng)紀人”,像股票經(jīng)紀人一樣,是用于促成“交易”的,Celery中它的職責就是給 worker 推送任務。
而backend的職責是存放執(zhí)行信息和結(jié)果,這些數(shù)據(jù)需要被持久化存于數(shù)據(jù)庫。但為了簡化問題,我們將其與broker一樣放置于redis當中。
- 需要你在自己已經(jīng)創(chuàng)建的app(不是celery的app,而是django項目的app)目錄下面,創(chuàng)建task.py文件(這個文件名只能是這個)

因為Celery會統(tǒng)一從每個app下面的tasks里面監(jiān)聽任務。
- 編寫tasks.py的任務
看一下tasks內(nèi)部的任務如何寫:

任務的目標是延遲3秒后,返回一個語句。
- init.py中的設置
這個是非常關鍵的一點,如何讓django在啟動的時候,也把celery給啟動了呢?
答案是在項目的init文件內(nèi),導入celery的app

2.Django 其他配置
為了能夠觸發(fā)該異步任務,我們接下來配置一些常規(guī)文件,views和url,首先是views函數(shù):

然后是url:
path('test_c', test_c, name='test_c'),
3.進行測試
首先,運行django項目
python manage.py runserver
這樣,django項目和celery的app就被一起啟動了,但是這個時候是無法執(zhí)行這個task的,因為worker沒有被啟動,我們可以試一下:
訪問: http://127.0.0.1:8000/stats/test_c
會得到以下報錯:

正確的姿勢是怎么樣的?需要先激活worker,然后再訪問API:
celery -A NBAsite worker -l info
結(jié)果如下:

從上圖下方的log信息里可以看到,在延遲了3秒后,任務啟動并返回字符串,而在頁面上,也可以看到成功返回。
需要注意的是,如果你修改了tasks的內(nèi)容,是需要重啟celery才能生效的,最簡單的方法就是重啟django項目。
這樣,我們就完成了簡單的異步任務的配置和使用。
4.定時任務配置
在異步任務中,我們只用到了worker,而在定時任務中,還要用到celery的beat調(diào)度器。
首先來看下如何配置定時任務,或者說如何配置這個調(diào)度器。
還是在celery.py里面進行配置:

重點是增加了app.conf.beat_schedule這個定時任務配置,指定了 stats 文件夾下 tasks.py 中的auto_sc函數(shù),定時于20:47分執(zhí)行。
5.具體任務頁面tasks
增加一個對應要做定時任務的task
@shared_task
def auto_sc():
print ('sc test?')
return 'halo'
6.運行命令和結(jié)果
命令的話可以將激活worker和激活beat合并在一起,如下:
celery -A NBAsite worker -B -l info
不過,windows不被允許這么使用,因此在windows環(huán)境下,你需要同時打開worker和beater:
celery -A NBAsite worker -l info
celery -A NBAsite beat -l info

看上圖下方的log可知定時任務被成功執(zhí)行。至此便完成了定時任務的配置與執(zhí)行。
-
數(shù)據(jù)庫
+關注
關注
7文章
4016瀏覽量
68326 -
python
+關注
關注
57文章
4876瀏覽量
90012 -
Django
+關注
關注
0文章
45瀏覽量
10869
發(fā)布評論請先 登錄
關于stm32系統(tǒng)定時任務的問題
Linux系統(tǒng)定時任務Crond
ucos iii定時任務有什么用?
定時任務的發(fā)展史是怎么樣的
SpringBoot如何實現(xiàn)動態(tài)增刪啟停定時任務
基于Django的Celery異步任務和定時任務的實戰(zhàn)教程
評論