一、什么是Celery

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以实现任务的异步处理以及定时任务的处理,它的基本工作流程是:

  • 先启动任务执行单元Worker,让它一直监听消息中间件中是否有任务
  • 客户端可以发布异步任务和定时任务
  • 通过Celery将上述任务添加到消息中间件(可以使用rabbitMQ或者Redis)
  • 此时Worker可以监听到中间件中有任务,进行执行任务
  • 执行完毕后任务结果就放到Backend中(可以使用Redis或者Mysql)

这里主要讨论在Django中如何使用Celery来执行异步任务和定时任务。

二、Django中执行异步任务

1、环境配置

需要注意的是包之间的兼容性

pip install celery == 4.3.0

pip install eventlet == 0.25.1

pip install redis == 3.2.0

2、创建Django项目

其目录结构如下:

- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py

3、定义Celery实例

创建celery.py文件,位于proj/proj/celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings # set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') app = Celery('proj') # 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(lambda: settings.INSTALLED_APPS) @app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

4、导入Celery实例

然后,需要将此上述Celery的实例导入到proj/proj/__init__.py 模块中。这样可以确保在Django启动时加载该应用,以便@shared_task装饰器将使用该应用:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app __all__ = ('celery_app',)

5、在Django配置文件中配置Celery参数

位于:proj/proj/settings.py

...

CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0' # Broker配置,使用Redis作为消息中间件

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0' # BACKEND配置,这里使用redis

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

...

6、创建异步任务

在每一个app下创建tasks.py文件,如下图所示:

这样Celery会自动发现每一个app下的tasks.py文件,在这个文件中写入的就是需要执行的异步任务,相当于Worker。

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task @shared_task
def add(x, y):
print(x+y)
return x + y @shared_task
def mul(x, y):
return x * y @shared_task
def xsum(numbers):
return sum(numbers)

7、在Django的视图中添加任务,获取结果

from django.shortcuts import render,HttpResponse
from app01.tasks import add,mul
# Create your views here. #异步任务
def celery_test(request):
#delay相当于将异步任务add加入到Broker
task = add.delay(4,22)
#从Backend中获取执行任务的结果
res = task.get()
print(res)
return HttpResponse(task)

8、执行异步任务

上述准备工作已经完毕,此时需要启动一个或多个worker进程来监听Broker是否有任务

#启动Worker
celery -A proj worker -l info -P eventlet

此时,已经监听Broker了;当访问对应url,执行celery_test函数,会执行到add.delay相当于将任务添加到Broker,这样在视图中可以操纵异步任务执行的结果了。

三、Django中执行定时任务

1、安装django-celery-beat

pip install django-celery-beat

2、Django配置文件添加django-celery-beat

INSTALLED_APPS = (
...,
'django_celery_beat',
)

3、生成对应的表

python manage.py migrate

此时,可以看到生成的一些表

注意,这些任务会自动从每一个app下的tasks中读取,只要是注册过的(用shared_task装饰过)

定时任务具体的时间需要在上述表中设定好,因为定时任务就是从数据库中这些表中读取的

4、启动定时任务

首先,还是需要启Worker,这与异步任务相同

 celery -A proj worker -l info -P eventlet

然后需要再开启一个进程用于监听Broker里面的定时任务,到一定的时间,Worker执行

celery -A proj beat -l info -S django

值得注意的是每添加或修改一个任务,celery beat都需要重启一次

 

Celery与Django的结合的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 分布式队列celery 异步----Django框架中的使用

    仅仅是个人学习的过程,发现有问题欢迎留言 一.celery 介绍 celery是一种功能完备的即插即用的任务对列 celery适用异步处理问题,比如上传邮件.上传文件.图像处理等比较耗时的事情 异步执 ...

  3. Using Celery with Django

    参考1: http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-with-d ...

  4. celery在Django中的集成使用

    继上回安装和使用Redis之后,看看如何在Django中使用Celery.Celery是Python开发分布式任务列队的处理库.可以异步分布式地异步处理任务,也可定时执行任务等等.通常我们可以在Dja ...

  5. Celery在Django中的使用介绍

    Celery在Django中的使用介绍 Celery简介 celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具. 它是一个专注于实时处理的任务队列,同时也 ...

  6. Celery结合Django使用

    一.Celery介绍 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个 ...

  7. celery在Django中的应用

    这里不解释celery,如果不清楚可以参考下面链接: http://docs.celeryproject.org/en/latest/getting-started/introduction.html ...

  8. Celery学习---Celery 与django结合实现计划任务功能

    项目的目录结构: 项目前提: 安装并启动Redis 安装Django和Celery的定时任务插件 安装方法一: pip直接安装[安装了pip的前提下] omc@omc-virtual-machine: ...

  9. 使用celery执行Django串行异步任务

    Django项目有一个耗时较长的update过程,希望在接到请求运行update过程的时候,Django应用仍能正常处理其他的请求,并且update过程要求不能并行,也不能漏掉任何一个请求 使用cel ...

随机推荐

  1. linux运维、架构之路-内网NTP时间服务器

    一.环境 [root@m01 tmp]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 tmp]# hostname -I ...

  2. 项目部署到tomcat上

    1:先讲解一下tomcat的各个目录的作用 2:将项目打包成war的格式,然后放到webapps chengtai   是启动项目的时候自动解压的,不需要我们手动解压. 3:启动tomcat 进入到b ...

  3. web应用,http协议简介,web框架

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

  4. java文件断点上传

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  5. [HG]奋斗赛M

    题A     请进入链接↑ 题B     请进入链接↑ 题C     请进入链接↑ 题D     请进入链接↑ 题E     请进入链接↑ 题F     懒得写了,借用一下Chtholly_Tree巨 ...

  6. Solr基本命令

    启动Solr 安装Solr后,进入到Solr主目录中的bin文件夹,并使用以下命令启动Solr. [Hadoop@localhost ~]$ cd [Hadoop@localhost ~]$ cd S ...

  7. (转)基于TLS证书手动部署kubernetes集群(下)

    转:https://www.cnblogs.com/wdliu/p/9152347.html 一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已 ...

  8. p5405 [CTS2019]氪金手游

    题目大意 题意狗屁不通 看毛子语都比看这个题面强 分析 我们假设这棵树是一个内向树 那么我们可以轻易的得到dp[x][i]表示x点子树和为i的期望 转移只需枚举当前期望大小和子树期望大小即可 但是由于 ...

  9. android7.0后对于file://的限制

    错误信息: 04-18 14:56:58.283  4440  4440 W System.err: android.os.FileUriExposedException: file:///stora ...

  10. Oracle--索引视图序列等对象

    ---恢复内容开始--- 索引 与表类似,不仅需要在DD中保存索引的定义,还需要在表空间为它分配实际的存储空间. 将索引和对应的表分别存放在不同硬盘的不同表空间中能够提高查询的速度,因为Oracle能 ...