首页 > 其他分享 >Django与celery集成:异步任务原理和过程

Django与celery集成:异步任务原理和过程

时间:2023-06-21 15:38:23浏览次数:46  
标签:__ 异步 settings myrecrument Django celery django djangotest

0.原理和架构

a.客户发送请求到django;

b.django产生任务(要执行的函数);

c.django把任务丢给celery的broker

d.celery的worker从broker拿到任务并且执行;

e.worker执行后保存结果到后端数据库;

Django与celery集成:异步任务原理和过程_json

 

 

1.在django里面配置celery的目录结构

PS D:\djangotest\myrecrument> tree

D:.
├─.idea
│  └─inspectionProfiles
├─celery
│  └─__pycache__
│ - manage.py
├─interview
│  ├─management
│  │  └─commands
│  │      └─__pycache__
│  ├─migrations
│  │  └─__pycache__
│  └─__pycache__
├- db.sqlite3
├─myrecrument
│  └─settings.py
└─tmp

2.关联django和celery

2. cat D:\djangotest\myrecrument\myrecrument\celery.py

import os


from celery import Celery


# set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myrecrument.settings')


app = Celery('myrecrument')


# Using a string here means the worker doesn't have to serialize

# the configuration object to child processes.

# - namespace='CELERY' means all celery-related configuration keys

#   should have a `CELERY_` prefix.

app.config_from_object('django.conf:settings', namespace='CELERY')


# Load task modules from all registered Django app configs.

app.autodiscover_tasks()



@app.task(bind=True)

def debug_task(self):

    print(f'Request: {self.request!r}')

 

3. cat D:\djangotest\myrecrument\myrecrument\settings.py

CELERY_BROKER_URL = 'redis://106.45.274.145:30013/0'
CELERY_RESULT_BACKEND = 'redis://106.45.274.145:30013/1'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYD_MAX_TASKS_PER_CHILD = 10
CELERYD_LOG_FILE = os.path.join(BASE_DIR, "logs", "celery_work.log")
CELERYBEAT_LOG_FILE = os.path.join(BASE_DIR, "logs", "celery_beat.log")

 4.配置异步发送钉钉消息D:\djangotest\myrecrument\interview> cat .\dingtalk.py

#coding=utf-8
from dingtalkchatbot.chatbot import DingtalkChatbot

from django.conf import settings

def send(message, at_mobiles=[]):
    # 引用 settings里面配置的钉钉群消息通知的WebHook地址:
    webhook = settings.DINGTALK_WEB_HOOK

    # 初始化机器人小丁, # 方式一:通常初始化方式
    xiaoding = DingtalkChatbot(webhook)

    # 方式二:勾选“加签”选项时使用(v1.5以上新功能)
    # xiaoding = DingtalkChatbot(webhook, secret=secret)

    # Text消息@所有人
    xiaoding.send_text(msg=('面试通知: %s' %message), at_mobiles = ['14743373423'] )

5.D:\djangotest\myrecrument\interview> cat .\task.py #配置任务task

from __future__ import absolute_import, unicode_literals

from celery import shared_task 
from .dingtalk import send

@shared_task
def send_dingtalk_message(message):
    send(message)

 

6.在interview的admin.py D:\djangotest\myrecrument\interview> cat .\admin.py #应用tasks

from .tasks import send_dingtalk_message
...
def notify_interviewer(modeladmin,request,queryset):
    candidates = ' '
    for obj in queryset:
        candidates = obj.username + ';' + candidates
    send_dingtalk_message.delay(candidates)

   class CandidateAdmin(admin.ModelAdmin):

    actions = (export_model_as_csv,notify_interviewer)

 7.启动监控flower:D:\djangotest\myrecrument\celery>  celery -A tasks flower  broker='redis://redis:30013/0'

8.启动celery的worker:D:\djangotest\myrecrument> celery -A myrecrument   worker --loglevel=INFO -P eventlet

9.启动项目:D:\djangotest\myrecrument> python .\manage.py runserver 0.0.0.0:8000

10.flower的效果

Django与celery集成:异步任务原理和过程_json_02

 参考:https://docs.celeryproject.org/en/stable/django/first-steps-with-django.html   First steps with Django

 

用一个例子来演示会更加清晰



标签:__,异步,settings,myrecrument,Django,celery,django,djangotest
From: https://blog.51cto.com/u_13747193/6528791

相关文章

  • Django 日志配置
    Django项目日志配置记录业务运行过程中的一些关键信息,方便查看程序运行情况以及排查报错等详细日志配置settings.py配置文件中新增日志配置#设置时区,日志输出时间为utc-8时区#TIME_ZONE='UTC'TIME_ZONE='Asia/Shanghai'#日志配置LOGGING={'versio......
  • 通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
    毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率先支持了Passkeys登录方式,只须在设备上利用PIN码解锁、指纹或面部辨识等生物识别方式,即可验......
  • JavaScript异步编程:异步的数据收集方法
    我们先尝试在不借助任何工具函数的情况下来解决这个问题。笔者能想到的最简单的方法是:因前一个readFile的回调运行下一个readFile,同时跟踪记录迄今已触发的回调次数,并最终显示输出。下面是笔者的实现结果。Asyncjs/seriesByHand.jsvarfs=require('fs');process.chdir('recipes'......
  • POSTGRESQL 事务控制(三) 事务关闭与怎么设置PG 异步提交提高性能
    。最近接到网友反馈,说次系列是打开5秒钟系列,打开5秒后就关闭了,其实我想说的是,我更难,写的脑袋疼,不过估计疼一段时间就不会再疼的,看一段时间就可以看更长的时间,人的进步是吧。接上期,事务在执行完毕后,结束的动作分为两种,1事务提交2 事务回滚至于事务回滚时的问题主要也分手动终止以......
  • django+pip install djangorestframework
    ###################### pipinstalldjangopipinstalldjangorestframeworkdjango-adminstartprojectexample.pyuthonmanage.pymigratepythonmanage.pycreatesuperuser                 ##################### ......
  • fpga svpwm算法 fpga svpw算法,矢量调制调制基于FPGA,具有过调制,同步调制,异步调制功能。
    fpgasvpwm算法fpgasvpw算法,矢量调制调制基于FPGA,具有过调制,同步调制,异步调制功能。带死区输出模块,主图为io口直接滤波后的效果。FPGA是一种可编程逻辑器件,可以用于实现各种数字电路功能。在这里,FPGA被用于实现矢量调制调制算法,即SVPWM算法。SVPWM算法是一种用于产生PWM信号的技......
  • MQTT 生产者(异步)代码解读
    一、问题引入MQTT使用也有一段时间了,包括同步和异步的使用。这里根据官方案例和本人的理解,记录以下学习过程。二、解决过程简要介绍编写MQTTProducer的消息发布(异步)过程:第1步:创建客户端LIBMQTT_APIintMQTTAsync_create(MQTTAsync*handle,constchar*serverURI,con......
  • Celery的使用
    celery是什么Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。Celery的架构由三部分组成,消息中间件(messagebroker),任务执行单元(worker)和任务执行结果存储(taskresultstore)组成。消息中间件Celery本身不提供消息服......
  • 异步操作的方法和技术
    异步操作是一种编程模式,用于处理那些可能耗时的任务,以确保应用程序在执行这些任务的同时能够继续响应其他操作。下面是一些常见的异步操作的方法和技术:回调函数(Callbacks):这是一种传统的异步编程模式,其中函数在完成任务后调用预定义的回调函数。回调函数允许在异步操作完成后执......
  • std::thread 四:异步(async)
     *:如果std::async中传递参数std::lunnch::deferred,就需要等待调用get()或者wait()才会执行,并且代码非子线程运行,而是在主线程中执行 #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThre......