使用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使用socket连接远程服务器的方法
Apr 29 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
浅谈Python的异常处理
Jun 19 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
简单实现python收发邮件功能
Jan 05 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
python FTP编程基础入门
Feb 27 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
python读取二进制mnist实例详解
2017/05/31 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
园林设计师自荐信
2013/11/18 职场文书
学前班教师的自我鉴定
2013/12/05 职场文书
九年级体育教学反思
2014/01/23 职场文书
物资采购方案
2014/06/12 职场文书
婚庆公司计划书
2014/09/15 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
python垃圾回收机制原理分析
2022/04/13 Python