使用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实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
利用python将图片转换成excel文档格式
Dec 30 Python
Python内存读写操作示例
Jul 18 Python
详解python:time模块用法
Mar 25 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
python读写文件write和flush的实现方式
Feb 21 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
详解python UDP 编程
Aug 24 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
python基于tkinter制作无损音乐下载工具
Mar 29 Python
Python matplotlib多个子图绘制整合
Apr 13 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异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
Python随机生成彩票号码的方法
2015/03/05 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
九月份红领巾广播稿
2014/01/22 职场文书
党支部换届选举方案
2014/05/08 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
物业保安岗位职责
2014/07/02 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
限期整改通知书
2015/04/22 职场文书
特种设备安全管理制度
2015/08/06 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
MySQL为id选择合适的数据类型
2021/06/07 MySQL