Django 中使用 Celery

起步

在 《分布式任务队列Celery使用说明》 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能。本文介绍如何在 Django 中使用 Celery。

安装

pip install django-celery

这个命令使用的依赖是 Celery 3.x 的版本,所以会把我之前安装的 4.x 卸载,不过对功能上并没有什么影响。我们也完全可以仅用Celery在django中使用,但使用 django-celery 模块能更好的管理 celery。

使用

可以把有关 Celery 的配置放到 settings.py 里去,但我比较习惯单独一个文件来放,然后在 settings.py 引入进来:

# celery_config.py
import djcelery
import os

os.environ.setdefault(‘FORKED_BY_MULTIPROCESSING‘, ‘1‘)
djcelery.setup_loader()

BROKER_URL = ‘redis://127.0.0.1:6379/1‘
CELERY_RESULT_BACKEND = ‘redis://127.0.0.1:6379/2‘

# UTC
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = ‘Asia/Shanghai‘

CELERY_IMPORTS = (
    ‘app.tasks‘,
)

# 有些情况可以防止死锁
CELERY_FORCE_EXECV = True

# 设置并发的worker数量
CELERYD_CONCURRENCY = 4

# 任务发送完成是否需要确认,这一项对性能有一点影响
CELERY_ACKS_LATE = True

# 每个worker执行了多少任务就会销毁,防止内存泄露,默认是无限的
CELERYD_MAX_TASKS_PER_CHILD = 40

# 规定完成任务的时间
CELERYD_TASK_TIME_LIMIT = 15 * 60  # 在15分钟内完成任务,否则执行该任务的worker将被杀死,任务移交给父进程

# 设置默认的队列名称,如果一个消息不符合其他的队列就会放在默认队列里面,如果什么都不设置的话,数据都会发送到默认的队列中
CELERY_DEFAULT_QUEUE = "default"

# 设置详细的队列
CELERY_QUEUES = {
    "default": { # 这是上面指定的默认队列
        "exchange": "default",
        "exchange_type": "direct",
        "routing_key": "default"
    },
    "beat_queue": {
        "exchange": "beat_queue",
        "exchange_type": "direct",
        "routing_key": "beat_queue"
    }

}

配置文件中设置了 CELERY_IMPORTS 导入的任务,所以在django app中创建相应的任务文件:

# app/tasks.py
from celery.task import Task
import time

class TestTask(Task):
    name = ‘test-task‘  # 给任务设置个自定义名称

    def run(self, *args, **kwargs):
        print(‘start test task‘)
        time.sleep(4)
        print(‘args={}, kwargs={}‘.format(args, kwargs))
        print(‘end test task‘)

在 settings.py 添加:

INSTALLED_APPS = [
    # ...
    ‘djcelery‘,
]

# Celery
from learn_django.celery_config import *

触发任务或提交任务可以在view中来调用:

# views.py
from django.http import HttpResponse
from app.tasks import TestTask

def test_task(request):
    # 执行异步任务
    print(‘start do request‘)
    t = TestTask()
    t.delay()
    print(‘end do request‘)
    return HttpResponse(‘ok‘)

启动 woker 的命令是:

python manage.py celery worker -l info

再启动django,访问该view,可以看到任务在worker中被消费了。

定时任务

在celery的配置文件 celery_config.py 文件中添加:

CELERYBEAT_SCHEDULE = {
    ‘task1-every-1-min‘: {  # 自定义名称
        ‘task‘: ‘test-task‘, # 与任务中name名称一致
        ‘schedule‘: datetime.timedelta(seconds=5),
        ‘args‘: (2, 15),
        ‘options‘: {
            ‘queue‘: ‘beat_queue‘,  # 指定要使用的队列
        }
    },

}

通过 options 的 queque 来指定要使用的队列,这里需要单独的队列是因为,如果所有任务都使用同一队列,对于定时任务来说,任务提交后会位于队列尾部,任务的执行时间会靠后,所以对于定时任务来说,使用单独的队列。

启动 beat:

python manage.py celery beat -l info

监控工具 flower

如果celery中的任务执行失败了,有些场景是需要对这些任务进行监控, flower 是基于 Tornado 开发的web应用。安装用 pip install flower ;启动它可以是:

python manage.py celery flower

# python manage.py celery flower --basic_auth=admin:admin

用浏览器访问 http://localhost:5555 即可查看:

原文地址:https://www.cnblogs.com/596014054-yangdongsheng/p/10446837.html

时间: 2024-11-05 19:35:03

Django 中使用 Celery的相关文章

Django中使用Celery实现定时任务(用djcelery)

[TOC] 一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用户端的简单逻辑交互,还要实现一些定时任务.举出以下的例子: 定期删除或缓存Redis数据库的记录 为了追求更高的数据库访问性能,我把Redis作为MySql数据库的缓存.把常访问的数据放在Redis中,然后定时存储到Mysql中.并且把过期的Redis数据删掉.那么这个时候,就需要定时去

django中使用celery发送邮件

1.安装两个包:celery, django-celery pip install celery==3.1.25 pip install django-celery==3.1.17 2.配置 项目目录/项目名目录/settings.py 1.将celery添加到注册应用中 INSTALLED_APPS = ( ......, 'djcelery', ...... ) 2.配置celery import djcelery djcelery.setup_loader()  # 去每一个应用目录下找

Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示

解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', namespace='CELERY') 修改成下面所示结果: celery_app.config_from_object(settings, namespace='CELERY') 除此之外,还需要在proj/proj/celery.py文件头部引入settings配置: from django.conf

django中使用celery

创建django项目celery_demo, 创建应用demo: django-admin startproject celery_demo python manage.py startapp demo #celery.pyfrom celery import Celery from django.conf import settings import os # 为celery设置环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cele

django中使用celery异步发送邮件问题

通过提示说明Celery 4.x 需要Django1.11或者后面的版本,可是使用的是django1.8.2的版本,最先以为是自己什么地方配置出错了,找了很久也没有找到. 任务队列启动没错,任务处理启动也没问题,打开输入地址就报错. 最终看到使用的是Celery4.3.0,然后改成4.1.1版本就可以使用了. 具体问题没找到,应该是新版本加入了一些东西,以后再来研究. 原文地址:https://www.cnblogs.com/-666/p/11279843.html

异步任务利器Celery(二)在django项目中使用Celery

Celery 4.0支持django1.8及以上的版本,低于1.8的项目使用Celery 3.1. 一个django项目的组织如下: - proj/ - manage.py - proj/ - __init__.py - settings.py - urls.py 首先建立proj/proj/celery.py文件: from __future__ import absolute_import, unicode_literals import os from celery import Cele

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

前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队列框架,鉴于网上关于Celery和Django结合的文档较少,大部分也只是粗粗介绍了大概的流程,在实践过程中还是遇到了不少坑,希望记录下来帮助有需要的朋友. 一.Django中的异步请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 --

Django中Celery的实现

Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Celery介绍 Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. 上图展示的是Celery的架构,它采用典型的生产者-消费者模式,主要由三部分组成:broker(消息队列).workers(消费者:处理任务).backend(存储结果). 消息中间件:Celery本

celery在Django中的使用

前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队列框架,鉴于网上关于Celery和Django结合的文档较少,大部分也只是粗粗介绍了大概的流程,在实践过程中还是遇到了不少坑,希望记录下来帮助有需要的朋友. 一.Django中的异步请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 --