Django中使用Celery的方法示例

 更新时间:2018年11月29日 08:27:21   作者:栖迟于一丘  
这篇文章主要介绍了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 即可查看:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python编程pytorch深度卷积神经网络AlexNet详解

    Python编程pytorch深度卷积神经网络AlexNet详解

    AlexNet和LeNet的架构非常相似。这里我们提供了一个稍微精简版本的AlexNet,去除了当年需要两个小型GPU同时运算的设计特点
    2021-10-10
  • OpenCV-Python模板匹配人眼的实例

    OpenCV-Python模板匹配人眼的实例

    模板匹配是指在当前图像A内寻找与图像B最相似的部分,本文详细的介绍了OpenCV-Python模板匹配人眼的实例,感兴趣的可以了解一下
    2021-06-06
  • PyQT5 QTableView显示绑定数据的实例详解

    PyQT5 QTableView显示绑定数据的实例详解

    今天小编就为大家分享一篇PyQT5 QTableView显示绑定数据的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python数据结构与算法中的队列详解(2)

    Python数据结构与算法中的队列详解(2)

    这篇文章主要为大家详细介绍了Python中的队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Opencv图像处理之详解掩膜mask

    Opencv图像处理之详解掩膜mask

    这篇文章主要介绍了Opencv图像处理之详解掩膜mask,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • PyQt5 python 数据库 表格动态增删改详情

    PyQt5 python 数据库 表格动态增删改详情

    这篇文章主要介绍了PyQt5 python 数据库 表格动态增删改详情,首先手动连接数据库与下一个的程序连接数据库是独立的2个部分,下面来看看文章的详细介绍
    2022-01-01
  • Python OpenCV 图像矫正的原理实现

    Python OpenCV 图像矫正的原理实现

    这篇文章主要介绍了Python OpenCV 图像矫正的原理实现,检测边缘点;以边缘点作为输入,采用Hough直线检测,检测出最多点共线的四条直线,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • python实现微信每日一句自动发送给喜欢的人

    python实现微信每日一句自动发送给喜欢的人

    这篇文章主要为大家详细介绍了python实现微信每日一句自动发送给喜欢的人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • python实现扑克牌交互式界面发牌程序

    python实现扑克牌交互式界面发牌程序

    这篇文章主要介绍了python实现扑克牌交互式界面发牌程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • python numpy中setdiff1d的用法说明

    python numpy中setdiff1d的用法说明

    这篇文章主要介绍了python numpy中setdiff1d的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论