使用celery和Django处理异步任务的流程分析


Posted in Python onFebruary 19, 2020

介绍

我们可能需要一些可以安排一些任务并定期运行一些任务或异步处理长任务的东西,而这一切都可以通过在Django Project中使用Celery来实现。

什么是Celery?

Celery是 一个专注于实时处理的任务队列,它还支持任务调度。 Celery快速,简单,高度可用且灵活。

Celery需要消息传输来发送和接收消息,这可以由Redis或RabbitMQ完成。

入门

让我们开始在您的virtualenv中安装Celery软件包。

安装Celery

<span class="nv">$ </span>pip <span class="nb">install </span>celery
pip install celery

安装Redis

我们将Message Broker用作Redis,所以我们安装

Linux / Mac用户

您可以从这里下载最新版本

$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar xzf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$make

Windows用户

对于Windows用户,您可以从此处获取redis的可执行文件。

安装后,请尝试是否正确安装。

$ redis-cli ping

它应该显示:

pong

同时安装redis的python包

$ pip install redis

Django的第一步

现在您已经成功安装了软件包,现在就开始学习Django Project

settings.py Add some of the setting configuration in your settings.py CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'redis://localhost:6379' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = "YOUR_TIMEZONE"

确保您已从YOUR_TIMEZONE更改时区。 您可以从这里获取时区

主Django项目目录中创建celery.py文件

- src/ - manage.py - celery_project/ - __init__.py - settings.py - urls.py - celery.py celery_project/celery.py

在celery.py模块中添加以下代码。 该模块用于定义celery实例。

确保已使用django项目名称更改了项目名称(<your project name>)

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your project name>.settings')
app = Celery('<your project name>')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
 print('Request: {0!r}'.format(self.request))
celery_project/__init__.py

然后,我们需要将定义celery.py的应用程序导入到主项目目录的__init__.py。 这样,我们可以确保在Django项目启动时已加载应用

from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ['celery_app']

创建任务

现在创建一些任务

在您在INSTALLED_APPS中注册的任何应用程序中创建一个新文件

my_app/tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task(name = "print_msg_with_name")
def print_message(name, *args, **kwargs):
 print("Celery is working!! {} have implemented it correctly.".format(name))
@shared_task(name = "add_2_numbers")
def add(x, y):
 print("Add function has been called!! with params {}, {}".format(x, y))
 return x+y

开始程序

打开一个NEW终端并运行以下命令以运行celery的worker实例,并将目录更改为您的主项目目录所在的位置,即,将manage.py文件放置的目录,并确保您已经 激活您的virtualenv(如果已创建)。

用您的项目名称更改项目名称

$ celery -A <your project name> worker -l info

输出:

-------------- celery@root v4.1.0 (latentcall) ---- **** ----- --- * *** * -- Linux-4.13.0-32-generic-x86_64-with-Ubuntu-17.10-artful 2018-02-17 08:09:37 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: celery_project:0x7f9039886400 - ** ---------- .> transport: redis://localhost:6379// - ** ---------- .> results: redis://localhost:6379/ - *** --- * --- .> concurrency: 4 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . add_2_numbers . celery_project.celery.debug_task . print_msg_with_name [2018-02-17 08:09:37,877: INFO/MainProcess] Connected to redis://localhost:6379// [2018-02-17 08:09:37,987: INFO/MainProcess] mingle: searching for neighbors [2018-02-17 08:09:39,084: INFO/MainProcess] mingle: all alone [2018-02-17 08:09:39,121: WARNING/MainProcess] /home/jai/Desktop/demo/lib/python3.6/site-packages/celery/fixups/django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments! warnings.warn('Using settings.DEBUG leads to a memory leak, never ' [2018-02-17 08:09:39,121: INFO/MainProcess] celery@root ready.

注意:检查上面的[tasks],它应该包含您在task.py模块中创建的任务的名称。

有关更多信息和日志,您还可以在DEBUG MODE中运行worker实例

celery <span class="nt">-A</span> <your project name> worker <span class="nt">-l</span> info <span class="nt">--loglevel</span><span class="o">=</span>DEBUG celery -A <your project name> worker -l info --loglevel=DEBUG

注意:请勿关闭此终端,应保持打开状态!!

测试任务

现在让我们从django shell运行任务打开Django shell

$ python3 manage.py shell

用delay方法运行函数:

>>> from my_app.tasks import print_message, add
>>> print_message.delay("Jai Singhal")
<AsyncResult: fe4f9787-9ee4-46da-856c-453d36556760>
>>> add.delay(10, 20)
<AsyncResult: ca5d2c50-87bc-4e87-92ad-99d6d9704c30>

当检查您的celery worker实例正在运行的第二个终端时,您将获得此类型的输出,显示您的任务已收到且任务已成功完成

[2018-02-17 08:12:14,375: INFO/MainProcess] Received task: my_app.tasks.print_message[fe4f9787-9ee4-46da-856c-453d36556760] [2018-02-17 08:12:14,377: WARNING/ForkPoolWorker-4] Celery is working!! Jai Singhal have implemented it correctly. [2018-02-17 08:12:14,382: INFO/ForkPoolWorker-4] Task my_app.tasks.print_message[fe4f9787-9ee4-46da-856c-453d36556760] succeeded in 0.004476275000342866s: None [2018-02-17 08:12:28,344: INFO/MainProcess] Received task: my_app.tasks.add[ca5d2c50-87bc-4e87-92ad-99d6d9704c30] [2018-02-17 08:12:28,349: WARNING/ForkPoolWorker-3] Add function has been called!! with params 10, 20 [2018-02-17 08:12:28,358: INFO/ForkPoolWorker-3] Task my_app.tasks.add[ca5d2c50-87bc-4e87-92ad-99d6d9704c30] succeeded in 0.010077004999857309s: 30

总结

以上所述是小编给大家介绍的使用celery和Django处理异步任务的流程分析,希望对大家有所帮助,也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python将xml和xsl转换为html的方法
Mar 10 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
Python3多线程基础知识点
Feb 19 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python3中列表list合并的四种方法
Apr 19 Python
pandas中的series数据类型详解
Jul 06 Python
python之列表推导式的用法
Nov 29 Python
Python实现AI换脸功能
Apr 10 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
Django静态文件加载失败解决方案
Aug 26 Python
Python Django / Flask如何使用Elasticsearch
Apr 19 Python
Python Numpy,mask图像的生成详解
Feb 19 #Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 #Python
Python中logging日志库实例详解
Feb 19 #Python
在Python中通过threshold创建mask方式
Feb 19 #Python
python实现简单颜色识别程序
Feb 19 #Python
python绘制封闭多边形教程
Feb 18 #Python
python Shapely使用指南详解
Feb 18 #Python
You might like
PHP安装全攻略:APACHE
2006/10/09 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP单例模式详细介绍
2015/07/01 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
vue-axios使用详解
2017/05/10 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
python实现查询苹果手机维修进度
2015/03/16 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
Python切片操作实例分析
2018/03/16 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
详解Django配置JWT认证方式
2020/05/09 Python
如何使用python写截屏小工具
2020/09/29 Python
婚庆公司的创业计划书
2014/01/22 职场文书
大学生活动策划方案
2014/02/10 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
vue递归实现树形组件
2022/07/15 Vue.js