Django 中使用 Celery
安装#
1 | pip install django-celery |
这个命令使用的依赖是 Celery 3.x 的版本,所以会把我之前安装的 4.x 卸载,不过对功能上并没有什么影响。我们也完全可以仅用Celery在django中使用,但使用 django-celery
模块能更好的管理 celery。
使用#
可以把有关 Celery 的配置放到 settings.py
里去,但我比较习惯单独一个文件来放,然后在 settings.py
引入进来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # 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中创建相应的任务文件:
1 2 3 4 5 6 7 8 9 10 11 12 | # 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
添加:
1 2 3 4 5 6 7 | INSTALLED_APPS = [ # ... 'djcelery', ] # Celery from learn_django.celery_config import * |
触发任务或提交任务可以在view中来调用:
1 2 3 4 5 6 7 8 9 10 11 | # 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 的命令是:
1 | python manage.py celery worker -l info |
再启动django,访问该view,可以看到任务在worker中被消费了。
定时任务#
在celery的配置文件 celery_config.py
文件中添加:
1 2 3 4 5 6 7 8 9 10 11 | 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:
1 | python manage.py celery beat -l info |
监控工具 flower#
如果celery中的任务执行失败了,有些场景是需要对这些任务进行监控, flower
是基于 Tornado 开发的web应用。安装用 pip install flower
;启动它可以是:
1 2 3 | python manage.py celery flower # python manage.py celery flower --basic_auth=admin:admin |
用浏览器访问 http://localhost:5555
即可查看:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架