Django中使用Celery的方法示例


Posted in Python onNovember 29, 2018

起步

在 《分布式任务队列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 即可查看:

Django中使用Celery的方法示例

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

Python 相关文章推荐
常用python数据类型转换函数总结
Mar 11 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
python实现公司年会抽奖程序
Jan 22 Python
Django model select的多种用法详解
Jul 16 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
Python流程控制常用工具详解
Feb 24 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
记一次python 内存泄漏问题及解决过程
Nov 29 #Python
对python pandas 画移动平均线的方法详解
Nov 28 #Python
对pandas中时间窗函数rolling的使用详解
Nov 28 #Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 #Python
使用python对文件中的数值进行累加的实例
Nov 28 #Python
python的concat等多种用法详解
Nov 28 #Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 #Python
You might like
php中json_encode中文编码问题分析
2011/09/13 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Python的time模块中的常用方法整理
2015/06/18 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python实现感知器
2017/12/19 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
白酒市场营销方案
2014/02/25 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
中层干部培训方案
2014/06/16 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
毕业生工作求职信
2014/06/30 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL
mysql sql常用语句大全
2022/06/21 MySQL