Django 使用celery處理非同步任務

2022-04-11 20:03:24 字數 1927 閱讀 1577

略過

pip install celery==3.1.18
celery4不再支援windows,所以在windows環境下使用請選擇celery==3.1.18

celery需要一種解決訊息的傳送和接受的方式,我們把這種用來儲存訊息的的中間裝置叫做message broker, 也可叫做訊息中間人。 作為中間人,我們有幾種方案可選擇:

如果我們使用的是ubuntu或者debian發行版的linux,可以直接通過下面的命令安裝rabbitmq: sudo apt-get install rabbitmq-server 安裝完畢之後,rabbitmq-server伺服器就已經在後台執行。如果您用的並不是ubuntu或debian, 可以在以下**:  去查詢自己所需要的版本軟體。

redis也是一款功能完備的broker可選項,但是其更可能因意外中斷或者電源故障導致資料丟失的情況。 關於使用哪個redis作為broker,可訪下面**: 

本次使用redis作為broker

pip install redis==2.10.6
redis使用2.10.6版本,之前用最新的3.5.3會出錯

在上面建立的tasks.py模組中寫入如下:

import

random

from time import

sleep

from celery import

celery

#我們這裡案例使用redis作為broker,和資料儲存

broker = '

redis:

'backend = '

redis:

'demo

', broker=broker, backend=backend)

#def

my_task(a, b):

print("

開始執行任務了,代號:{},結果為:{}

".format(random.randint(1, 100), a+b))

sleep(15)

print("

非同步任務執行完成")

return a+b

在專案根目錄下執行:

啟動好了之後最下方顯示如下,太長沒有截全

後續測試發現任務已經執行,但是狀態一直是pending,且redis中也沒有寫入return的結果。----這種現象好像是windows才會有linux正常

解決辦法:引數後加上--pool=solo

任務加入到broker佇列中,以便剛才我們建立的celery worker伺服器能夠從佇列中取出任務並執行。

如何將任務函式加入到佇列中,可使用delay()。

可以看到已經可以獲取任務的結果了。

可以看到celery worker伺服器從佇列中取出任務並執行,且redis中也已儲存task的返回值

pip install flower
啟動flower,指定broker

celery flower --broker=redis://localhost:6379/2
啟動好了如下:

訪問:檢視task:

參考:

django中使用celery 一

建立django專案celery demo,建立應用demo 在celery demo模組中建立celery.py模組,檔案目錄為 celery.py模組內容為 from celery import celery from django.conf import settings import os ...

django中使用celery及gevent

celery是分布式非同步任務佇列,通過在django中整合celery任務,可實現工作流的定製 非同步執行i o工作量大的任務 定時任務。下面的例子,給出了定時任務的實現過程。原始碼 django admin startproject mysite在mysite下建立poll應用 2 建立後mys...

Celery在Django中的使用

celery 是乙個強大的分布式任務佇列,它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務 async task 和定時任務 crontab 非同步任務 比如傳送郵件 手機驗證碼,或者檔案上傳,影象處理等等一些比較耗時的操作 定時任務 需要在特定時間執...