Celery在Django中的使用

2021-09-09 08:58:16 字數 3569 閱讀 9283

celery 是乙個強大的分布式任務佇列,它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務( async task )和定時任務( crontab )。

非同步任務:比如傳送郵件、手機驗證碼,或者檔案上傳, 影象處理等等一些比較耗時的操作 ;

定時任務:需要在特定時間執行的任務。

簡單:一單熟悉了celery的工作流程後,配置和使用還是比較簡單的

高可用:當任務執行失敗或執行過程中發生連線中斷,celery 會自動嘗試重新執行任務

快速:乙個單程序的celery每分鐘可處理上百萬個任務

靈活: 幾乎celery的各個元件都可以被擴充套件及自定製

celery採用典型的生產者-消費者模式,主要由三部分組成:broker(訊息佇列)、workers(消費者:處理任務)、backend(儲存結果)。實際應用中,使用者從web前端發起乙個請求,我們只需要將請求所要處理的任務丟入任務佇列broker中,由空閒的worker去處理任務即可,處理的結果會暫存在後台資料庫backend中。我們可以在一台機器或多台機器上同時起多個worker程序來實現分布式地並行處理任務。

任務task:要非同步執行的任務比如我們傳送郵件的**。

佇列queue:將需要執行的任務加入到佇列中。

工人worker:在乙個新程序中,負責執行佇列中的任務。

**人broker:負責排程,在部署環境中使用redis或者rabbitmq(預設)。

產生任務task會放到queue佇列中,

**人broker會通知空閒的worker工人佇列中有任務,

worker工人就會去佇列中把任務task取出來執行。每乙個worker就是乙個工作的程序。

celery3.1版本需要乙個單獨的庫來與django一起工作,3.1以後的版本就不在需要了,django現在支援開箱即用,

需要注意的是celery 4.0支援django 1.8及更新版本。請將celery 3.1用於早於django 1.8的版本

說明

首先,我們必須擁先建立乙個用於傳送和接收訊息訊息中介軟體。celery官網給出了多個broker的備選方案:rabbitmq、redis(推薦)、database(不推薦)以及其他的訊息中介軟體。本案例使用redis作為broker

安裝

# 目前必須使用當前版本的版本,redis 3.x以上的版本不支援,官方目前還沒有修復該bug

pip install redis==2.10.6

#

說明本案例使用的最新的4.x版本,因為相容性存在很大的差異,所有選擇版本的時候一定要注意

安裝

pip install celery==4.2.1
說明在django專案的配置檔案同級的目錄下建立乙個 celery.py模組來定義celery例項

本案例使用的是django==1.11.12

示例

import os

from celery import celery

# 設定專案的配置檔案,專案名稱.settings

os.environ.setdefault(

'django_settings_module'

,'dj_celery.settings'

)# 例項化celery 乙個工程中可以例項化多個 但是django中是沒有必要例項化多個celery物件

'dj_celery'

)# 載入celery配置檔案

'django.conf:settings'

, namespace=

'celery'))

# 開啟debug模式

true

)def

debug_task

(self)

:print

('request: '

.format

(self.request)

)

在配置檔案中的init檔案中註冊

from __future__ import absolute_import, unicode_literals
說明

示例**

# 傳遞訊息時使用的redis 的ip 埠 資料庫名

broker_url = 'redis:'

說明

不要修改檔案的名稱

示例**

import time

from celery import shared_task

@shared_task

defsend_mail()

:print

('開始傳送郵件'

) time.sleep(2)

print

('傳送完成'

)return

'1'

啟動django專案

啟動redis

sudo service redis start
啟動worker

celery worker -a dj_celery -l info
說明worker 就是我們的工人了,他們會努力完成我們的工作的。

-loglevel=info 指明了我們的工作後台執**況,雖然工人們已經向你保證過一定努力完成任務。但是謹慎的你還是希望看看工作進展情況。

7 win10

valueerror: not enough values to unpack (expected 3, got 0)
安裝

pip install eventlet
啟動worker

celery -a worker -l info -p eventlet

celery提供了乙個工具flower,將各個任務的執**況、各個worker的健康狀態進行監控並以視覺化的方式展現,

安裝flower:

pip install flower
啟動flower(缺省會啟動乙個webserver,埠為5555):

python manage.py celery flower

即可檢視

http://localhost:5555 說明

長時間執行celery有可能發生記憶體洩露,可以像下面這樣設定

示例**

celeryd_max_tasks_per_child = 40 # 每個worker執行了多少任務就會死掉

Celery在Django中的使用介紹

celery簡介 celery是乙個簡單 靈活且可靠的,處理大量訊息的分布式系統,並且提供維護這樣乙個系統的必須工具。它是乙個專注於實時處理的任務佇列,同時也支援任務排程。celery的三大組成部分 worker 任務執行單元 worker是celery提供的任務執行的單元,worker併發的執行在...

Celery在Django中的使用介紹

celery是乙個簡單 靈活且可靠的,處理大量訊息的分布式系統,並且提供維護這樣乙個系統的必須工具。它是乙個專注於實時處理的任務佇列,同時也支援任務排程。任務執行單元 worker是celery提供的任務執行的單元,worker併發的執行在分布式的系統節點中。訊息中介軟體 celery本身不提供訊息...

非同步任務佇列Celery在Django中的使用

前段時間在django web平台開發中,碰到一些請求執行的任務時間較長 幾分鐘 為了加快使用者的響應時間,因此決定採用非同步任務的方式在後台執行這些任務。在同事的指引下接觸了celery這個非同步任務佇列框架,鑑於網上關於celery和django結合的文件較少,大部分也只是粗粗介紹了大概的流程,...