Django中使用Celery的方法示例

作者:栖迟于一丘 时间:2021-08-05 06:12:08 

起步

在 《分布式任务队列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的方法示例

来源:http://www.hongweipeng.com/index.php/archives/1680/

标签:Django,Celery
0
投稿

猜你喜欢

  • 数据库新手入门之MYSQL出错代码列表

    2008-12-23 15:22:00
  • python装饰器简介---这一篇也许就够了(推荐)

    2021-02-21 23:09:20
  • python实现最长公共子序列

    2023-06-14 20:53:42
  • Pytorch之卷积层的使用详解

    2022-09-04 16:43:21
  • 带你从内存的角度看Python中的变量

    2021-02-13 13:27:50
  • 对python当中不在本路径的py文件的引用详解

    2022-12-17 15:12:42
  • Oracle中命名块之存储过程的详解及使用方法

    2023-07-15 00:28:23
  • Python海龟turtle基础知识大全以及画图集合实例

    2022-05-01 08:12:34
  • Python3.遍历某文件夹提取特定文件名的实例

    2022-12-08 04:48:59
  • CentOS 7 安装python3.7.1的方法及注意事项

    2023-03-10 21:23:53
  • python hmac模块验证客户端的合法性

    2021-08-21 19:18:11
  • python去除扩展名的实例讲解

    2022-05-08 18:10:49
  • Python玩转PDF的各种骚操作

    2023-07-07 17:51:59
  • 网页设计求职全攻略

    2008-07-09 18:56:00
  • Python实现将16进制字符串转化为ascii字符的方法分析

    2023-11-17 12:26:25
  • 学习python需要有编程基础吗

    2022-05-01 15:23:47
  • 三招解决SQL Server数据库权限冲突

    2009-03-16 16:58:00
  • python中的脚本性能分析

    2023-10-31 00:37:22
  • ASP常见的保留字整理(变量与表名注意不能用)

    2013-06-01 19:58:01
  • python算法深入理解风控中的KS原理

    2021-01-12 21:27:37
  • asp之家 网络编程 m.aspxhome.com