首页 > 其他 > 详细

celery在django中的使用

时间:2019-10-16 22:43:41      阅读:49      评论:0      收藏:0      [点我收藏+]

曾经有一个叫django-celery的模块,大家都用它来做django的异步任务。后来因为它对django、celery还有django-celery的版本要求太高了\
,稍有不对就用不了,而且至今那个django-celery模块已经很长时间没更新过了,所以大家就都单独使用celery了。但在django中使用需要注意几点也是我遇见的几个坑,后面会讲到。

 

1.安装celery

pip install celery==3.1.25 

2.celery简介

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

  celery有以下优点:

  1. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
  2. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
  3. 快速:一个单进程的celery每分钟可处理上百万个任务
  4. 灵活: 几乎celery的各个组件都可以被扩展及自定制

  celery组成结构

    消息中间件(message broker)
      Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等
    任务执行单元(worker)
      Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
    任务执行结果存储(task result store)
      Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

 

  技术分享图片

  工作流程图 

   技术分享图片

3.celery的使用

  因为celery本身不提供消息服务,所以需要配置第三方消息中间件,如redis,RebbitMq,若不配置,默认用的RebbitMq
  安装RebbitMq
    https://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#id3
  安装reids
    https://www.runoob.com/redis/redis-install.html
  在本篇中使用redis

  1.目录结构

  假设项目名为Demo,app名为app01

    Demo
      Demo
        __init__.py
        settings.py
        celery.py
        ...
      app01
        views.py
        task.py
        ...

 

  2.settings中配置

BROKER_TRANSPORT_OPTIONS = {visibility_timeout: 43200}  # 设置超时时间,一定要设置
BACKEND=redis://127.0.0.1:6379/3
BROKER=redis://127.0.0.1:6379/4

  3.__init__.py中配置

from __future__ import absolute_import
from .celery import app as celery_app

  4. celery_task可以放在app中也可以放在app外,根据项目配置。celery.py中需要做配置

import os
from celery import Celery
from NP.settings import BACKEND,BROKER
from django.conf import settings

# set the default Django settings module for the ‘celery‘ program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "NP.settings")

app = Celery(app01,backend=BACKEND,broker=BROKER)  # 若不配置backend和broker,则默认使用rebbitmq作为消息中间件

# 将celery的settings设置为django的settings,需要配置celery,只需要在settings中配置即可
app.config_from_object(django.conf:settings)

# 使用这句,则在task中就不需要根据相对路径导入celery对象了,只需要导入shared_task
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

  5.task中写任务处理逻辑

  一般来说,一个app中只需要写一个task文件就可以了,并为每一个任务添加装饰器

from celery import shared_task

@shared_task
def add_user(data):
    ...
    return 用户添加成功!

@shared_task
def email(data):
    ...
    return 邮件发送成功!

 

5.views中触发任务

from task import add_user,emial

class userViewset():
  def post(request):
    add_user.delay(request.data)

class EmailViewset():
  def post(request):
    email.

 

6.需要注意的几点:
  1.delay()方法只能传递可被Json序列化的数据,也就是说不能传递对象。如果传了不可序列化的数据则会报错:
    kombu.exceptions.EncodeError: Object of type Request is not JSON serializable

  2.配置一定要正确,如果用单独使用时的celery.py配置文件,则无法导入django中的任何包

celery在django中的使用

原文:https://www.cnblogs.com/gyk1030/p/11688359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!