时间:2021-05-22
起步
在 《分布式任务队列Celery使用说明》 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能。本文介绍如何在 Django 中使用 Celery。
安装
这个命令使用的依赖是 Celery 3.x 的版本,所以会把我之前安装的 4.x 卸载,不过对功能上并没有什么影响。我们也完全可以仅用Celery在django中使用,但使用 django-celery 模块能更好的管理 celery。
使用
可以把有关 Celery 的配置放到 settings.py 里去,但我比较习惯单独一个文件来放,然后在 settings.py 引入进来:
# celery_config.pyimport djceleryimport osos.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'# UTCCELERY_ENABLE_UTC = TrueCELERY_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.pyfrom celery.task import Taskimport timeclass 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',]# Celeryfrom learn_django.celery_config import *触发任务或提交任务可以在view中来调用:
# views.pyfrom django.http import HttpResponsefrom app.tasks import TestTaskdef 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 即可查看:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
如下所示:pip3installdjango-celery-resultsINSTALLED_APPS=(...,'django_celery_results'
最近项目中用到celery很多,Django快速接入celery,这里给份教程。准备pip安装celery、flower、eventlet快速接入1.项目目录的
安装pipinstalldjango-crontab在Django项目中使用settings.pyINSTALLED_APPS=('django.contrib
上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发。本系列文章的开发环境:window7+pyt
Celery简介除了redis,还可以使用另外一个神器---Celery。Celery是一个异步任务的调度工具。Celery是DistributedTaskQu