django+celery+rabbitmq实践
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django+celery+rabbitmq实践相关的知识,希望对你有一定的参考价值。
参考技术A 看到标题,相信大家就知道这个帖子要讲啥了……如果你希望在django中使用celery执行异步任务,用MQ(rabbimq,下同)做消息中间件,那么此贴完全可以满足你,包括celeryp、MQ配置,以及MQ路由配置等,相信你会喜欢。简单说明一下:
1,django:web框架
2,celery: 用于创建执行异步任务
3,RabbitMQ:消息队列,主要用于消息存储
对于celery,rabbimq安装没啥好说的, pip直接装就好了,配置与启动也不赘述。关键环节简要说明如下:
一,在django中配置和使用celery
配置大致如下:
(1),工程目录下,创建celery.py, 内容编辑如下:
……
(2), 各app根目录下创建tasks.py
app相关的task均放置在tasks.py中,并用装饰器shared_task装饰,示例如下:
def get_jid_result(*args, **kwargs): pass 任务调度方法:
1)后台定时执行task,可安装djcelery模块,在django后台调度已注册的任务,关于djcelery的使用方法,在此不详细介绍。
2)触发调度,在需要调用task的d地方,直接调用各task的delay()方法即可(当然要先import),如:
get_jid_result.delay(*args, **kwargs)
二, celery woker
工程目录下执行sudo -u apache bash -c 'celery -A patools worker -l info (注意,此处使用apache用户执行,celery建议不要使用superuser 启动),启动celery worker。
建议:为确保celery worker进程平稳运行, 可以使用superivsor守护该进程的执行, 配置示例如下:
进入supervisorctl, 启动相应进程,OK!
三,中间件rabbitmq
对于中间件的选择,redis,MQ都可以,差异不作详细说明,视应用情况而选择。实践中采用rabbimq作为中间件,在此,对rabbimq路由做简单说明。
django settings配置,如celery配置部分, 另外,配置消息路由:
CELERY_DEFAULT_QUEUE = 'default'CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_DEFAULT_ROUTING_KEY = 'default'# routing task
CELERY_IMPORTS = (
# 注册各应用tasks文件在此,注意,必须确保注册模块存在,否则将导致worker进程报错
"app1.tasks",
"app2.tasks",
# other apps
)
#交换器定义,示例如下:
# 路由定义, 示例如下:
以上是我在搭建基于Django框架的过程中对celery及MQ配置应用实践的小结,希望对有相关需求的同志们有些许的帮助,不足之处多多批评指正。
在 Django 网站部署中使用 Celery/RabbitMQ/Flower
【中文标题】在 Django 网站部署中使用 Celery/RabbitMQ/Flower【英文标题】:Using Celery/RabbitMQ/Flower in deployment with Django Website 【发布时间】:2021-06-21 11:34:12 【问题描述】:我有一个使用 celery 调度异步任务的 django 网站。当我处于开发模式时,我运行以下命令:
celery -A proj worker --pool=solo -l INFO
flower -A proj --port:5555
celery -A proj beat -l info
为了我的项目工作。如何在基于云的托管服务(例如 pythonanywhere)上运行这些命令。在开发中,我会去 localhost 和端口号查看rabbitmq 和flower。这将如何在部署中发挥作用?
【问题讨论】:
【参考方案1】:这不适用于 PythonAnywhere。还有其他方法可以在 Web 应用程序中进行异步操作。 https://help.pythonanywhere.com/pages/AsyncInWebApps/
【讨论】:
以上是关于django+celery+rabbitmq实践的主要内容,如果未能解决你的问题,请参考以下文章
Django-celery 和 RabbitMQ 不执行任务
Heroku 上的 Celery、RabbitMQ 和 Django:达到内存限制
未执行的任务(Django + Heroku + Celery + RabbitMQ)
ModuleNotFoundError: 没有使用 celery 和 rabbitmq 的名为 'django.config' 的模块