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' 的模块

django+celery+rabbitmq 编码错误和 sig-kill

Django、Celery、Redis、RabbitMQ:Fanout-On-Writes 的链式任务