Django中如何使用django-celery完成异步任务 (1)

Django 使用 Celery 完成异步任务或定时任务 Celery是一个分布式任务队列,由三个主要组件组成:Celery worker、Celery beat 和消息代理(例如 Redis 或 RabbitMQ)。这些组件一起协作,让开发者能够轻松地执行异步任务和定时任务。Celery worker:负责接收任务请求并执行任务。当您在 Django 应用程序中调用 apply_async 方法时,任务将被发送到 Celery worker,然后由 worker 执行。Celery beat:负责调度定时任务。 阅读详情

本篇博文主要介绍在开发环境中的celery使用,请勿用于部署服务器.

许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此一旦学会使用Celery, 我们可以很方便的在其他项目中使用它.

1. Celery版本

本篇博文主要针对Celery 3.0.x. 早期版本的Celery可能有细微的差别.

2. Celery介绍

Celery的主要用处是执行异步任务, 可以选择延期或定时执行功能. 为什么需要执行异步任务呢?

第一, 假设用户正发起一个request, 并等待request完成后返回. 在这一request后面的view功能中, 我们可能需要执行一段花费很长时间的程序任务, 这一时间可能远远大于用户能忍受的范围. 当这一任务并不需要立刻执行时, 我们便可以使用Celery在后台执行, 而不影响用户浏览网页. 当有任务需要访问远程服务器完成时, 我们往往都无法确定需要花费的时间.

第二则是定期执行某些任务. 比如每小时需要检查一下天气预报, 然后将数据储存到数据库中. 我们可以编写这一任务, 然后让Celery每小时执行一次. 这样我们的web应用便能获取最新的天气预报信息.

我们这里所讲的任务task, 就是一个Python功能(function). 定期执行一个任务可以被认为是延时执行该功能. 我们可以使用Celery延迟5分钟调用function task1, 并传入参数(1, 2, 3). 或者我们也可以每天午夜运行该function.

我们偏向于将Celery放入项目中, 便于task访问统一数据库和Django设置.

当task准备运行时, Celery会将其放入列队queue中. queue中储存着可以运行的task的list. 我们可以使用多个queue, 但为了简单, 这里我们只使用一个.

将任务task放入queue就像加入todo list一样. 为了使task运行, 我们还需要在其他线程中运行的苦工worker. worker实时观察着代运行的task, 并逐一运行这些task. 你可以使用多个worker, 通常他们位于不同服务器上. 同样为了简单起见, 我们这只是用一个worker.

我们稍后会讨论queue, worker和另外一个十分重要的进程, 接下来我们来动动手:

3. 安装Celery

我们可以使用pip在vietualenv中安装:

    pip install django-celery

4. Django设置

我们暂时使用django runserver来启动celery. 而Celery代理人(broker), 我们使用Django database broker implementation. 现在我们只需要知道Celery需要broker, 使用django自身便可以充当broker. (但在部署时, 我们最好使用更稳定和高效的broker, 例如Redis.)

在settings.py中:

    import djcelery
    djcelery.setup_loader()
    BROKER_URL = 'django://'
    ...
    INSTALLED_APPS = (
       ...
       'djcelery',
       'kombu.transport.django',
       ...
    )

第一二项是必须的, 第三项则告诉Celery使用Django项目作为broker.

在INSTALLED_APPS中添加的djcelery是必须的. kombu.transport.django则是基于Django的broker

最后创建Celery所需的数据表, 如果使用South作为数据迁移工具, 则运行:

    python manage.py migrate

否则运行: (Django 1.6或Django 1.7都可以)

    python manage.py syncdb

5. 创建一个task

正如前面所说的, 一个task就是一个Pyhton function. 但Celery需要知道这一function是task, 因此我们可以使用celery自带的装饰器decorator: @task. 在django app目录中创建taske.py:

    from celery import task

    @task()
    def add(x, y):
        return x + y

当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为task的function, 并将它们注册为celery task.

将function标注为task并不会妨碍他们的正常执行. 你还是可以像平时那样调用它: z = add(1, 2).

6. 执行task

让我们以一个简单的例子作为开始. 例如我们希望在用户发出request后异步执行该task, 马上返回response, 从而不阻塞该request, 使用户有一个流畅的访问过程. 那么, 我们可以使用.delay, 例如在在views.py的一个view中:

    from myapp.tasks import add
    ...
        add.delay(2, 2)
    ...

Celery会将task加入到queue中, 并马上返回. 而在一旁待命的worker看到该task后, 便会按照设定执行它, 并将他从queue中移除. 而worker则会执行以下代码:

    import myapp.tasks.add

    myapp.tasks.add(2, 2)

7. 关于import

这里需要注意的是, 在impprt task时, 需要保持一致. 因为在执行djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注册的, 如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug.

8. 测试

a. 启动worker

正如之前说到的, 我们需要worker来执行task. 以下是在开发环境中的如何启动worker:

首先启动terminal, 如同开发django项目一样, 激活virtualenv, 切换到django项目目录. 然后启动django自带web服务器: python manage.py runserver.

然后启动worker:

    python manage.py celery worker --loglevel=info

此时, worker将会在该terminal中运行, 并显示输出结果.

b. 启动task

打开新的terminal, 激活virtualenv, 并切换到django项目目录:

    $ python manage.py shell
    >>> from myapp.tasks import add
    >>> add.delay(2, 2)

此时, 你可以在worker窗口中看到worker执行该task:

    [2014-10-07 08:47:08,076: INFO/MainProcess] Got task from broker: myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]
    [2014-10-07 08:47:08,299: INFO/MainProcess] Task myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc] succeeded in 0.183349132538s: 4

9. 另一个例子

下面我们来看一个更为真实的例子, 在views.py和tasks.py中:

    # views.py
    from myapp.tasks import do_something_with_form_data

    def view(request):
        form = SomeForm(request.POST)
        if form.is_valid():
            data = form.cleaned_data
            # Schedule a task to process the data later
            do_something_with_form_data.delay(data)
        return render_to_response(...)
    # tasks.py

    @task
    def do_something_with_form_data(data):
        call_slow_web_service(data['user'], data['text'], ...)

10. 调试

由于Celery的运行需要启动多个部件, 我们可能会漏掉一两个. 所以我们建议:

  • 使用最简单的设置
  • 使用python debug和logging功能显示当前的进程

11. Eager模式

如果在settings.py设置:

    CELERY_ALWAYS_EAGER = True

那么Celery便以eager模式运行, 则task便不需要加delay运行:

    # 若启用eager模式, 则以下两行代码相同
    add.delay(2, 2)
    add(2, 2)

12. 查看queue

因为我们使用了django作为broker, queue储存在django的数据库中. 这就意味着我们可以通过django admin查看该queue:

    # admin.py
    from django.contrib import admin
    from kombu.transport.django import models as kombu_models

    admin.site.register(kombu_models.Message)

13. 检查结果

每次运行异步task后, Celery都会返回AsyncResult对象作为结果. 你可以将其保存, 然后在将来查看该task是否运行成功和返回结果:

    # views.py

    result = add.delay(2, 2)
    ...
    if result.ready():
        print "Task has run"
        if result.successful():
            print "Result was: %s" % result.result
        else:
            if isinstance(result.result, Exception):
                print "Task failed due to raising an exception"
                raise result.result
            else:
                print "Task failed without raising exception"
     else:
         print "Task has not yet run"

14. 定期任务

还有一种Celery的常用模式便是执行定期任务. 执行定期任务时, Celery会通过celerybeat进程来完成. Celerybeat会保持运行, 一旦到了某一定期任务需要执行时, Celerybeat便将其加入到queue中. 不像worker进程, Celerybeat只有需要一个即可.

启动Celerybeat:

    python manage.py celery beat

使Celery运行定期任务的方式有很多种, 我们先看第一种, 将定期任务储存在django数据库中. 即使是在django和celery都运行的状态, 这一方式也可以让我们方便的修改定期任务. 我们只需要设置settings.py中的一项便能开启这一方式:

    # settings.py
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

然后我们便可以通过django admin的/admin/djcelery/periodictask/添加定期任务了.

  • Name: 这一定期任务的注册名
  • Task (registered): 可以选择所有已经注册的task之一, 例如前面的add function
  • Task (custom): task的全名, 例如myapp.tasks.add, 但最好还是用以上项
  • Enabled: 是否开启这一定期任务
  • Interval: 定期任务的间隔时间, 例如每隔5分钟
  • Crontab: 如果希望task在某一特定时间运行, 则使用Unix中的Crontab代替interval
  • Arguments: 用于传参数到task中
  • Execution Options: 更高级的设置, 在此不详细说明, 请查看celery官方文档

15. 注意

本篇博文中所描述的方法只适用于开发环境, 而不应当应用于部署环境.

如果希望在部署环境中使用, 最重要的便是使用更稳定和可扩展的broker, 而不是使用kombu.transport.django.

原文地址:http://www.weiguda.com/blog/categories/1/

celery详解(使用django+celery实现异步及定时任务以及使用supervisor进行管理) 最近工作之余,记录一下自己的笔记,首先来介绍一下celery (一)、为什么要使用celery,业务场景 1、我们平时工作中,经常会碰到一个视图里面写了很多逻辑,导致里面有一些很耗时的操作,比如发送邮件、短信之类的操作,这些我们一般是调用第三方sdk去做的,通常客户端接收响应需要等待,降低了服务器的吞吐量及性能 2、服务器难免会有定时任务的需求,比如用户数据更新,缓存清除等等 (二)、celery介绍 为了解决以上问题,我们可以使用celery Celery是一个功能完备即插即用的任务队列。 celery适 阅读详情

相关推荐

Django中如何使用django-celery完成异步任务

本篇博文主要介绍在开发环境中的celery使用,请勿用于部署服务器. 许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此

专注于互联网架构技术,努力成为一名架构师 2万+

django中异步化celery的使用/celery中时区问题

~网站优化第一定律:缓存 (空间换时间) -热数据(热点数据):体量不大、访问频率极高、更新不频繁 ~网站优化第二定律:削峰 (能不马上做的事情都不要马上做)、消息队列 -遇到耗时间的任务(用户请求),用户不需要马上得到结果、异步化、推迟执行 -多线程 -异步消息队列 -celery #在django中使用celery模块提供消息队列服务 import os import celery from django.conf import settings os.environ.setdefault('DJAN

weixin_44634704的博客 2589

Celery使用异步、定时任务使用

Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

qq_34960590的博客 1万+

django celery任务执行失败 django.core.exceptions.ImproperlyConfigured:

django celery任务执行失败 django.core.exceptions.ImproperlyConfigured: 问题 今天在检查celery执行任务的时候,冒出了个bug File "/home/tarena/.virtualenvs/meiduo_mall/lib/python3.6/site-packages/celery/app/task.py", line 667, in retry raise_with_context(exc) File "/home/taren

qq_37654083的博客 608

Django和Celery实现的异步任务案例

在Django中进行缓存是一种通过存储频繁访问的数据来提高网页应用程序性能的重要技术。 异步任务允许Django应用程序在HTTP请求-响应周期之外执行耗时的操作。这提高了性能和用户体验。 我们将探讨: 1. 在Django中设置Celery。 2. 使用消息代理(Redis)进行任务排队。 3. 创建和运行异步任务。 4. 一个小型项目,集成Celery用于邮件通知。

欧阳天涵的专栏 1417

Django项目中使用celery做异步任务_django中celery实现异步

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

碧海朝天素 1074

Django-异步处理

场景描述: 写了个构造数据的自动化脚本,准备集成到web上。 前端form表单提交构造数据所需的入参。实际操作时,前端点击保存后,由于构造数据的脚本要执行很久,导致前端的页面驻留太久。于是准备使用异步的方法解决这个问题。 需求:前端给个form表单填写参数,保存后数据存入DB(一条任务数据),状态默认为未处理;调用异步方法,执行脚本,脚本执行成功后修改任务状态。 技术栈 celery urls.py from django.conf.urls import url from web.views i.

gfcbeyond的博客 6386

Django 如何使用 Celery 完成异步任务或定时任务

以前版本的 Celery 需要一个单独的库(django-celery)才能与 Django 一起工作, 但从 Celery 3.1 开始,情况便不再如此,我们可以直接通过 Celery 库来完成在 Django 中的任务。

Gefangenes的博客 1057

Django3(二)异步编程

使用协程、线程、进程、消息队列等方式实现。支持多线程、内置异步和消息队列方式实现。多线程:在当前运行的Django服务中开启新的线程执行。内置异步:django3,使用asyncio和关键词Async/Await实现,异步功能主要在视图中实现(异步视图)消息队列:使用celery框架和消息队列中间件搭建,解决了应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和一致性的系统架构。一、使用多线程。

野猫炫的博客 6586

django-q:Django的多处理分布式任务队列

Django的多处理分布式任务队列 特征 多处理工作者池 异步任务 计划的,cron和重复的任务 签名并压缩的软件包 失败和成功数据库或缓存 结果挂钩,组和链 Django Admin集成 PaaS与多个实例兼容 多集群监控器 Redis,Disque,IronMQ,SQS,MongoDB或ORM Rollbar和Sentry支持 要求 > = 2.2 经过测试:Python 3.7、3.8 Django 2.2.X和3.1.X 警告 从Python 3.7开始,async成为保留关键字,并被重构为async_task 经纪人 雷迪斯 变形 IronMQ 亚马逊SQS MongoDB的 Django ORM 安装 使用pip安装最新版本: $ pip install django-q 在项目settings.py中将django_q添加到INSTALLED_APPS: IN

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 463

python django异步访问_Django中异步任务---django-celery

许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此一旦学会使用Celery, 我们可以很方便的在其他项目中使用它.本篇博文主要...

weixin_39620252的博客 700

FPGA SPI驱动ADC避坑指南:以ADC128S022为例,详解时序设计与代码调试

本文以ADC128S022为例,详细解析FPGA通过SPI驱动ADC的时序设计与代码调试中的常见问题。从时钟分频计算、SPI模式选择到状态机实现,提供避坑指南和实战技巧,帮助工程师解决数据采集系统中的时序匹配难题。特别针对FPGA与ADC通信中的微妙差异,给出精确的Verilog代码示例和ModelSim仿真验证方法。

weixin_42522374的博客 458

Django中使用django-celery完成异步任务(1)

许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此一旦学会使用Celery, 我们可以很方便的在其他项目中使用它.Celery介

Demo_3的博客 1054

微信小程序利用Echarts加载中国地图的步骤

微信小程序如何利用Echarts加载地图?可按照如下四个步骤进行。(阅读时间大概3分钟)。

成都都成 5275

STC8H单片机ADC实战:从读取电位器到串口绘图,12位精度玩起来

本文详细介绍了STC8H单片机的ADC功能实战应用,从读取电位器到串口绘图,展示了12位精度的实现方法。通过硬件连接、代码配置、串口数据传输及高级优化技巧,帮助开发者快速掌握ADC模块的使用,适用于各种传感器数据采集和信号处理场景。

weixin_28278377的博客 344

jango中如何使用django-celery完成异步任务 (1)

本篇博文主要介绍在开发环境中的celery使用,请勿用于部署服务器. 许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此

瞌睡猫 812

Pure Persuit算法基础

Pure Persuit算法本身的原理不难理解,它主要基于几何原理进行的设备控制,本身不考虑太多的运动学约束。同时机器人的路径跟踪效果应该会比较依赖于预瞄点。对于曲线部分而言,如果曲率很小而预瞄点很远的话,对于曲线的跟随性应该会很差。对于直线而言,如果设备在开始时与轨迹有横向偏差,则在运动过程中机器人会逐渐收敛到曲线,但是收敛速度取决于预瞄点距离。

YiYeZhiNian的博客 1522

django完成天天生鲜用户注册

登录注册会用户django自带的用户认证体系 首先:安装celery (我的版本3.1.26.post2),安装redis(2.10.1) 如果版本不对可能会报错 pip install celery pip install redis 注册功能 使用类视图,因为他自带了get和post等函数,可以不用判断前端method from django.views import View class ...

ouersl的博客 649

R语言dlnm包避坑指南:手把手教你配置交叉基矩阵(附温度分层与滞后多项式设置)

本文详细介绍了R语言dlnm包在配置交叉基矩阵时的实用技巧与避坑指南,特别针对温度分层与滞后多项式设置提供了具体参数配置建议。通过解析`crossbasis()`函数的核心参数、温度分析的分层策略以及不同基函数的适用场景,帮助研究者高效构建分布滞后非线性模型,避免常见错误并优化模型性能。

weixin_34094282的博客 401

2023年下半年网络工程师案例分析真题答案解析

R1] ip route-static 0.0.0.0 0.0.0.0 GigabitEthemet2/0/1 (3) track (4) R1 to R2 //配置R1的缺省路由,联动BFD使得R1到2的流量优先走R1->S1->R2链路,当此链路发生故障时,流量切换到R1->R3->R2链路上。当同一VLAN内也需要网络隔离时,我们可采用交换机的(2)功能,若在配置了二层隔离后,部分主机有互通的需求,则可在需求主机的网关上配置(3)功能。不需要,MAC地址是数据链路层封装以太帧的地址标识。

鹿鸣天涯 751

基于Django的毕业设计:新手入门实战与避坑指南

作为一名刚刚完成毕业设计的过来人,我深知用 Django 做第一个“正经”项目时的那种既兴奋又迷茫的感觉。网上教程很多,但东拼西凑,项目结构混乱,部署时更是状况百出。今天,我就把自己踩过的坑和总结的经验,梳理成这篇实战笔记,希望能帮你少走弯路,高效完成一个结构清晰、可扩展的 Django 毕业设计。

2600_94960225的博客 1014

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

GB28181 —— Win10下编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

1308

使用celery进行异步处理和定时任务(django)

在django中使用celery进行异步处理和定时任务

一个持续学习的小趴菜。 2892

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Django 中celery的使用

1、django应用Celery django框架请求/响应的过程是同步的,框架本身无法实现异步响应。 但是我们在项目过程中会经常会遇到一些耗时的任务, 比如:发送邮件、发送短信、大数据统计等等,这些操作耗时长,同步执行对用户体验非常不友好,那么在这种情况下就需要实现异步执行。 异步执行前端一般使用ajax,后端使用Celery。 2 、项目应用 django项目应用celery,主要有两种任务方式,一是异步任务(发布者任务),一般是web请求,二是定时任务。 celery组成请看celery介

qq_53582111的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

celery:celery介绍、架构、基本使用,celery执行异步任务、延迟任务、定时任务,django中使用celery。

celery介绍、架构、基本使用,celery执行异步任务、延迟任务、定时任务,django中使用celery。

WorldMvp的专栏 8011

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Python的高级并发技术
下一篇: Django中如何使用django-celery完成异步任务 (2)
youbo_sun
博客等级 码龄12年 20粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值