Django redis celery實現非同步任務

2022-07-26 10:12:11 字數 2464 閱讀 3289

1 django中的非同步請求

同步請求:所有邏輯處理、資料計算任務在view中處理完畢後返回response。在view處理任務時使用者處於等待狀態,直到頁面返回結果。

2 celery

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

3 django中celery的實現

環境:django:2.1.7 celery:3.1.26.post2(cipater) redis:2.10.6(注意:最新版本是3.2.1,但會報錯unrecoverable error: attributeerror("'str' object has no attribute 'items'")) redis-server:3.2.100

配置:1、settings.py檔案

# celery + redis

'djcelery',

# celery settings

import djcelery

djcelery.setup_loader()

broker_url = 'redis:'

# celery結果返回,可用於跟蹤結果

celery_result_backend = 'redis:'

# celery內容等訊息的格式設定

celery_task_serializer = 'json'

celery_result_serializer = 'json'

celery_scheduler = 'djcelery.schedulers.databasescheduler'

# celery時區設定,使用time_zone

celery_timezone = time_zone

2、在專案資料夾下增加celery.py檔案:

from __future__ import absolute_import

import os

from celery import celery

from django.conf import settings

# 設定環境變數

os.environ.setdefault('django_settings_module', 'mysite.settings')

# 例項化celery,網上很多教程都是未設定broker導致啟動失敗

# 使用django的settings檔案配置celery

# celery載入所有註冊的應用

3、專案的__init__.py檔案修改:

from __future__ import absolute_import

import time

from celery import task

@task

def test(a, b):

print('這是任務開始')

print(a+b)

time.sleep(10)

print('這是任務結束')

from . import tasks

def test_view(request, *args, **kwargs):

tasks.test.delay(1, 2)

result =

path('test/', views.test_view, name='test_view'),

4 執行**

1、python manage.py runserver

2、celery -a mysite worker --pool=solo -l info

3、訪問test

5 flower任務監控

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

django下實現的方式如下:

1. 安裝flower:pip install flowr

2. 啟動flower(缺省會啟動乙個webserver,埠為5555):python manage.py celery flower

3. 進入http://localhost:5555即可檢視。

Silverlight實現呼叫多個非同步任務

public enum actionstatus 這個記錄了任務的結果 public class actionresult 任務名稱 public string taskname 狀態 public actionstatus status 訊息 public string message 任務結果 ...

redis crontab php非同步處理任務

2016年1月8日 16 08 43 星期五 情景 使用者登入日誌,發郵件,發簡訊等等實時性要求不怎麼高的業務通常會非同步執行 之前接觸過幾種redis crontab配套的實現方法,比如 crontab定時執行curl指令碼 1.用curl 訪問url執行php指令碼去pop佇列 2.php程式p...

springboot整合定時任務與非同步任務

新增配置資訊 spring給我們配的執行緒池 spring task execution pool core size 5 max size 50建立乙個定時任務配置類 enablescheduling 開啟定時任務功能 enableasync 開啟非同步任務功能 開啟非同步任務功能 enablea...