国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django高級擴展之celery使用

這篇具有很好參考價值的文章主要介紹了Django高級擴展之celery使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Celery是一個簡單、靈活、可靠的分布式系統(tǒng),用于處理大量消息,同時為操作提供維護此類系統(tǒng)所需的工具。是一個專注于實時處理的任務隊列,同時還支持任務調度。

目錄

應用場景

問題

解決

celery架構圖

安裝

配置celery

Settings.py配置

創(chuàng)建celery

修改__init__

開啟celery

異步執(zhí)行

創(chuàng)建任務文件

視圖

路由

演示

啟動django

重啟celery

瀏覽器訪問

獲取執(zhí)行結果

AsyncResult屬性和方法

演示

視圖

路由

瀏覽器訪問

Celery報錯

kombu.async.timer

cannot import name 'current_app'

AttributeError

定時執(zhí)行

增加配置

多個任務執(zhí)行

創(chuàng)建執(zhí)行方法

啟動celery

綁定任務

實現(xiàn)綁定

實現(xiàn)錯誤重試

celery管理和監(jiān)控

安裝

運行命令

運行flower

瀏覽器訪問

總結

參考文章


應用場景

問題

1.用戶發(fā)起請求,需要等待響應返回;但是在視圖中如果有一些耗時操作,可能導致用戶會等待很長時間,這樣用戶體驗非常不好。

2.網站隔一段時間要同步一次數(shù)據,但是http請求是需要觸發(fā)的。

解決

使用celery來解決:耗時的操作方法在celery中異步執(zhí)行;還可以使用celery定時執(zhí)行。

?

celery架構圖

celery由以下四部分構成:

任務(Task)、代理(Broker)、任務執(zhí)行(Worker)、結果存儲(Backend)。

Django高級擴展之celery使用

?

安裝

命令如下:

pip install celery
pip install redis

# window下安裝,linux下不需要
pip install eventlet

?

配置celery

Settings.py配置

Settings.py中在最下面配置

# celery配置
# Broker配置,使用Redis作為消息中間件
BROKER_URL = 'redis://127.0.0.1:6379/1'
# 若有密碼這樣配置
# BROKER_URL = 'redis://:pwd@127.0.0.1:6379/1'

# BACKEND配置,這里使用redis
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 若有密碼這樣配置
# CELERY_RESULT_BACKEND = 'redis://:pwd@127.0.0.1:6379/1'

# 結果序列化方案
CELERY_RESULT_SERIALIZER = 'json'

# 任務結果過期時間,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24

# 時區(qū)配置
CELERY_TIMEZONE = 'Asia/Shanghai'

# 指定導入的任務模塊,可以指定多個
# CELERY_IMPORTS = (
#    'other_dir.tasks',
# )

?

創(chuàng)建celery

在工程目錄下的project目錄下創(chuàng)建celery.py文件。

Django高級擴展之celery使用

內容如下:

import os
from celery import Celery
from django.conf import settings


# 設置系統(tǒng)環(huán)境變量,安裝django,必須設置,否則在啟動celery時會報錯

# project 是當前工程目錄名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

celery_app = Celery('project')
celery_app.config_from_object('django.conf:settings')
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

修改__init__

在工程目錄下project的__init__文件中添加

from .celery import celery_app

__all__ = ['celery_app']

開啟celery

Window命令如下:

celery  -A project worker  -l debug -P eventlet

pip 安裝eventlet,在啟動celery的參數(shù)加上eventlet,

原理是windows不支持celery的進程執(zhí)行。

Linux 命令如下:

celery  -A project worker  -l

成功截圖如下:

Django高級擴展之celery使用

Redis數(shù)據庫?

Django高級擴展之celery使用

?

異步執(zhí)行

創(chuàng)建任務文件

在子應用目錄下創(chuàng)建tasks.py來執(zhí)行任務(寫耗時異步執(zhí)行)

Django高級擴展之celery使用

內容如下:

from celery import shared_task
import time



@shared_task
def add(x, y):
    print('添加一個事件')
    time.sleep(10)
    print(x, y)
    print('事件執(zhí)行完成')

視圖

應用視圖views.py中增加引入和視圖方法

from .tasks import *


def task_add(request):
    add.delay(100, 200)
    return HttpResponse(f'調用函數(shù)結果')

路由

urlpatterns = [
    # celery
    path(r'task_add', views.task_add, name='task_add'),
]

演示

啟動django

python manage.py runserver

重啟celery

celery  -A project worker  -l debug -P eventlet

瀏覽器訪問

然后瀏覽器訪問task路由。

Django高級擴展之celery使用

?通過worker的控制臺,可以看到任務被worker處理。

Django高級擴展之celery使用

獲取執(zhí)行結果

可通過AsyncResult對象通過返回的事件id來獲取事件信息。

AsyncResult屬性和方法

state: 返回任務狀態(tài),等同status;

task_id: 返回任務id;

result: 返回任務結果,同get()方法;

ready(): 判斷任務是否執(zhí)行以及有結果,有結果為True,否則False;

info(): 獲取任務信息,默認為結果;

wait(t): 等待t秒后獲取結果,若任務執(zhí)行完畢,則不等待直接獲取結果,若任務在執(zhí)行中,則wait期間一直阻塞,直到超時報錯;

successful(): 判斷任務是否成功,成功為True,否則為False;

演示

視圖

from celery import result
from django.http import JsonResponse


def task_info(request):

    task_id = request.GET.get('task_id')

    res = result.AsyncResult(task_id)
    if res.ready():
        return JsonResponse({'status': res.state, 'result': res.get()})
    else:
        return JsonResponse({'status': res.state, 'result': ''})

路由

path(r'task_info/<str:id>', views.task_info, name='task_info'),

瀏覽器訪問

地址欄傳入新增事件時,返回的事件id

Django高級擴展之celery使用

?

Celery報錯

kombu.async.timer

開啟celery,提示錯誤Kombu.async.timer import Entry......

Django高級擴展之celery使用

解決方法:

卸載celery,重裝固定版本

命令如下:

pip install celery==4.3

?

cannot import name 'current_app'

cannot import name 'current_app' from 'celery'

Django高級擴展之celery使用

解決方法:

打開D:\python3.7\lib\site-packages\celery\local.py"

原方法

def getappattr(path):
    """Get attribute from current_app recursively.

    Example: ``getappattr('amqp.get_task_consumer')``.

    """
    from celery import current_app
    return current_app._rgetattr(path)

修改為:

def getappattr(path):

    """Get attribute from current_app recursively.

    Example: ``getappattr('amqp.get_task_consumer')``.


    """
    # from celery import current_app
    from celery._state import current_app
    return current_app._rgetattr(path)

AttributeError

AttributeError: 'EntryPoints' object has no attribute 'get'

Django高級擴展之celery使用

解決方法:

安裝固定版本的importlib-metadata

命令如下:

pip install importlib-metadata==4.13.0

?

定時執(zhí)行

增加配置

工程目錄下/settings.py

CELERYBEAT_SCHEDULE = {
    'every_5_seconds': {
        # 任務路徑 應用目錄/任務文件/方法
        'task': 'myapp.tasks.schedule_execute',
        # 每5秒執(zhí)行一次
        'schedule': 5,
        # 設置參數(shù)
        'args': (14, 6, 5)
    }
}

多個任務執(zhí)行

可在原來基礎上繼續(xù)增加

CELERYBEAT_SCHEDULE = {
    'every_5_seconds': {
        # 任務路徑 應用目錄/任務文件/方法
        'task': 'myapp.tasks.schedule_execute',
        # 每5秒執(zhí)行一次
        'schedule': 5,
        # 設置參數(shù)
        'args': (14, 6, 5)
    },
    'every_10_seconds': {
        # 任務路徑 應用目錄/任務文件/方法
        'task': 'myapp.tasks.schedule_execute',
        # 每10秒執(zhí)行一次
        'schedule': 10,
        # 設置參數(shù)
        'args': (18, 10, 10)
    },
}

創(chuàng)建執(zhí)行方法

在task.py中設置執(zhí)行方法并記錄日志

from celery import shared_task
import logging

logger = logging.getLogger(__name__)


@shared_task
def schedule_execute(x, y, s):
    logger.info('_____' * 20)
    logger.info('每%d秒執(zhí)行一次' % s)
    logger.info('%d + %d = %d' % (x, y, (x+y)))
    logger.info('執(zhí)行結束')
    logger.info('_____' * 20)

啟動celery

(兩個cmd)分別啟動worker和beat

celery -A project worker -l debug -P eventlet
celery beat -A project -l debug

可通過控制臺查看執(zhí)行結果。

綁定任務

Celery可通過task綁定到實例獲取到task的上下文,這樣我們可以在task運行時候獲取到task的狀態(tài),記錄相關日志等

實現(xiàn)綁定

修改應用任務文件內容:在裝飾器中加入參數(shù) bind=True,在add函數(shù)中的第一個參數(shù)設置為self。

內容如下:

@shared_task(bind=True)
def add(self, x, y):

    print('添加一個事件')
    time.sleep(2)
    print(x, y)
    logger.info(self.name)
    logger.info(dir(self))
    print('事件執(zhí)行完成')

實現(xiàn)錯誤重試

self對象是myapp.tasks.add實例,可用于實現(xiàn)重試。

@shared_task(bind=True)
def add(self, x, y):

    try:
        print('添加一個事件')
        time.sleep(2)
        print(x, y)
        logger.info(self.name)
        # 沒有state屬性 只是為了驗證重試
        logger.info(self.state)
        logger.info(dir(self))
        print('事件執(zhí)行完成')

    except Exception as e:

        # 出錯每5秒嘗試一次,嘗試3次
        self.retry(exc=e, countdown=5, max_retries=3)

?

celery管理和監(jiān)控

celery通過flower組件實現(xiàn)管理和監(jiān)控功能。

Flower官網

Getting started — Flower 2.0.0 documentation

安裝

pip install flower

運行命令

celery -A project flower

Or

celery -A project flower --port=5001

參數(shù)說明

-A 項目名稱

--port 端口號,默認5555

運行flower

運行命令,顯示如下:

Django高級擴展之celery使用

瀏覽器訪問

http://127.0.0.1:port

Django高級擴展之celery使用

?

總結

本文主要介紹了celery的應用場景;

如何安裝及安裝哪些類庫;

異步和定時執(zhí)行實現(xiàn)以及任務可視化管理。

參考文章

https://www.cnblogs.com/chunyouqudongwuyuan/p/16892475.html

Django 中celery的使用_django celery_寵乖儀的博客-CSDN博客

在django中使用celery_嗶哩嗶哩_bilibili

一文讀懂 Python 分布式任務隊列 celery文章來源地址http://www.zghlxwxcb.cn/news/detail-502629.html

到了這里,關于Django高級擴展之celery使用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • redis(其它操作、管道)、django中使用redis(通用方案、 第三方模塊)、django緩存、celery介紹(celery的快速使用)

    redis(其它操作、管道)、django中使用redis(通用方案、 第三方模塊)、django緩存、celery介紹(celery的快速使用)

    1 redis其它操作 2 redis管道 3 django中使用redis 3.1 通用方案 3.2 第三方模塊 4 django緩存 5 celery介紹 5.1 celery的快速使用

    2024年02月07日
    瀏覽(26)
  • Django(21):使用Celery任務框架

    Django(21):使用Celery任務框架

    Django Web項目中我們經常需要執(zhí)行耗時的任務比如發(fā)送郵件、調用第三方接口、批量處理文件等等,將這些任務異步化放在后臺運行可以有效縮短請求響應時間。另外服務器上經常會有定時任務的需求,比如清除緩存、備份數(shù)據庫等工作。Celery是一個高效的異步任務隊列/基于

    2024年02月07日
    瀏覽(27)
  • django中使用celery和接口緩存

    celery中要使用djagno的東西,才要加這句話 ? ? ?? ?import os? ? ? ? ? ? ? ? ? ? ? ? ? os.environ.setdefault(\\\"DJANGO_SETTINGS_MODULE\\\", \\\"luffy_api.settings.dev\\\") 加載django的配置文件,,將app加入到環(huán)境變量中 當一個接口是去數(shù)據庫取東西,返回給前端,比如圖片,等,每個人訪問都要去數(shù)

    2024年02月12日
    瀏覽(30)
  • Django 如何使用 Celery 完成異步任務或定時任務

    以前版本的 Celery 需要一個單獨的庫(django-celery)才能與 Django 一起工作, 但從 Celery 3.1 開始,情況便不再如此,我們可以直接通過 Celery 庫來完成在 Django 中的任務。 以 Docker 安裝為例,安裝一個密碼為 mypassword 的 Redis 服務端 在 Django 項目中創(chuàng)建一個 celery.py 文件,并配置

    2023年04月25日
    瀏覽(17)
  • django celery 記錄

    django celery 記錄

    django celery 記錄 dvadmin-celery Django+Django-Celery+Celery的整合實戰(zhàn) https://cloud.tencent.com/developer/article/1445252 https://blog.csdn.net/wowocpp/article/details/131475484 https://docs.celeryq.dev/en/latest/django/first-steps-with-django.html https://docs.celeryq.dev/en/latest/django/index.html http://docs.celeryproject.org/en/latest/ https://

    2024年02月12日
    瀏覽(21)
  • Django+Celery學習筆記

    Django+Celery學習筆記 DJANGO中使用CELERY實現(xiàn)定時任務(用DJCELERY) https://www.cnblogs.com/wumingxiaoyao/p/8521567.html Django中celery機制的使用總結 https://blog.csdn.net/Enjolras_fuu/article/details/108513357 代碼 https://github.com/furuiyang0715/celery_learn 參考 https://www.celerycn.io/yong-hu-zhi-nan/canvas-she-ji-gong-zuo-liu-che

    2024年02月12日
    瀏覽(23)
  • Django+celery開啟時報錯

    django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread. The object with alias \\\'default\\\' was created in thread id 19767205568 00 and this is thread id 1976775359680. 問題: 執(zhí)行celery worker -A s1 -l info -P eventlet能正常,放立即執(zhí)行的任務(delay)沒有問題,不過放apply_async的任務

    2024年02月11日
    瀏覽(14)
  • django celery period 周期 例子

    django celery period 周期 例子 Django 借助 Celery 實現(xiàn)計劃任務排期及調度系統(tǒng)(django-celery-beat) good https://www.jianshu.com/p/f22346379dbe https://django-celery-results.readthedocs.io/en/latest/ https://django-celery-beat.readthedocs.io/en/latest/ 五、運行測試 為了使系統(tǒng)正常運行,需要同時開啟三個服務: web 服

    2024年02月12日
    瀏覽(16)
  • 利用Django和Celery管理定時任務

    同步發(fā)表于個人站點: http://panzhixiang.cn/article/2023/3/16/68.html 我們以前一直使用k8s的cronjob來管理定時任務的。把定時任務相關的代碼單獨封裝成一個pod,然后以cronjob的方法來觸發(fā)。 雖然這個方法操作很簡單,沒有什么第三方資源的依賴(比如Redis),但是也有一個明顯的缺點

    2024年02月07日
    瀏覽(21)
  • Django+Celery框架自動化定時任務開發(fā)

    Django+Celery框架自動化定時任務開發(fā)

    本章介紹使用DjCelery即Django+Celery框架開發(fā)定時任務功能,在Autotestplat平臺上實現(xiàn)單一接口自動化測試腳本、業(yè)務場景接口自動化測試腳本、App自動化測試腳本、Web自動化測試腳本等任務的定時執(zhí)行、調度、管理等,從而取代Jenkins上的定時執(zhí)行腳本和發(fā)送郵件等功能。** 自動化

    2024年04月15日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包