Python开发【模块】:Celery 分布式异步消息任务队列

前言:

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

  • 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。 
  • 你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福

Celery有以下优点:

  • 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
  • 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
  • 快速:一个单进程的celery每分钟可处理上百万个任务
  • 灵活: 几乎celery的各个组件都可以被扩展及自定制

Celery基本工作流程图:

 

1、 Celery安装使用

Celery需要在linux的环境下运行:

1
2
3
4
5
6
# 安装
[root@localhost celerys]# pip3 install celery
# 进入python import无异常表示安装成功
[root@localhost celerys]# python3
>>> import celery

Celery的默认broker是RabbitMQ, 仅需配置一行就可以

1
broker_url = 'amqp://guest:guest@localhost:5672//'

使用Redis做broker也可以

1
2
broker_url = 'redis://localhost:6379/0'
#redis://:password@hostname:port/db_number

 

2、简单使用

创建一个任务文件就叫tasks.py:

1
2
3
4
5
6
7
8
9
10
11
12
from celery import Celery
import time
app = Celery('cly',                                        # 任意
             broker='redis://192.168.1.166:6379/0',        # 中间件
             backend='redis://localhost')                  # 数据存储
  
@app.task
def add(x,y):
    time.sleep(10)
    print("running...",x,y)
    return x+y

启动Celery Worker来开始监听并执行任务:

1
2
3
4
5
# 加入环境变量
[root@localhost ~]# PATH=$PATH:/usr/local/python3.5/bin/
# 启动一个worker
[root@localhost celerys]# celery -A tasks worker --loglevel=info

调用任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost celerys]# python3
Python 3.5.2 (default, Jul  7 201723:36:01)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help""copyright""credits" or "license" for more information.
>>> from tasks import add                   # import add
>>> add.delay(4,6)                          # 执行函数
<AsyncResult: 4b5a8ab6-693c-4ce5-b779-305cfcdf70cd>   # 返回taskid
>>> result = add.delay(4,6)                 # 执行函数
>>> result.get()                            # 同步获取结果,一直等待
10
>>> result.get(timeout=1)                   # 设置超时时间,过期错误异常
Traceback (most recent call last):
    --strip--
celery.exceptions.TimeoutError: The operation timed out.
>>> result = add.delay(4,'a')               # 执行错误命令
>>> result.get()                            # get后获取到错误信息,触发异常
Traceback (most recent call last):
     --strip--
celery.backends.base.TypeError: unsupported operand type(s) for +'int' and 'str'
>>> result = add.delay(4,'a')
>>> result.get(propagate=False)             # propagate=False 不触发异常,获取错误信息
TypeError("unsupported operand type(s) for +: 'int' and 'str'",)
>>> result.traceback                        # 获取具体错误信息 log打印用
'Traceback (most recent call last):\n  File "/usr/local/python3.5/lib/python3.5/site-packages/celery/app/trace.py", line 367, in trace_task\n    R = retval = fun(*args, **kwargs)\n  File "/usr/local/python3.5/lib/python3.5/site-packages/celery/app/trace.py", line 622, in __protected_call__\n    return self.run(*args, **kwargs)\n  File "/data/celerys/tasks.py", line 12, in add\n    return x+y\nTypeError: unsupported operand type(s) for +: \'int\' and \'str\'\n'

此时worker端收到的信息:

1
2
3
4
[2017-07-08 03:12:22,565: WARNING/PoolWorker-1] running...     # 获取到任务
[2017-07-08 03:12:22,565: WARNING/PoolWorker-14
[2017-07-08 03:12:22,565: WARNING/PoolWorker-16              # 任务执行完毕数据存储到backend端
[2017-07-08 03:12:22,567: INFO/PoolWorker-1] Task tasks.add[683e395e-48b9-4d32-b3bb-1492c62af393] succeeded in 10.01260852499945s10

查看broker(即192.168.1.166)端数据:

1
2
3
4
5
6
[root@localhost redis-3.0.6]# src/redis-cli
127.0.0.1:6379> keys *
1"_kombu.binding.celeryev"
2"unacked_mutex"
3"_kombu.binding.celery.pidbox"
4"_kombu.binding.celery"

执行完后,backend端的数据:

1
2
3
[root@localhost redis-3.0.6]# src/redis-cli   # 程序get后,数据未被删除
127.0.0.1:6379> keys *
1"celery-task-meta-683e395e-48b9-4d32-b3bb-1492c62af393"

 

转载于:https://www.cnblogs.com/zknublx/p/9090162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS开发者的一些前端感悟

很多前端工程师会把自己比作“魔法师”&#xff0c;而对于JavaScript这门语言&#xff0c;我也想把它唤作一门“有魔力的语言”。因为这群有无限想法的人&#xff0c;真的在用它创造各种让你惊叹的事物。 Web三件套一、前言 几年前&#xff0c;笔者还是一名初涉编程的学生&…

windows下github 出现Permission denied (publickey)

github教科书传送门:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 再学习到"添加远程仓库"的时候遇到了 Permission denied (publickey) 这个问题&#xff0c; 总结来说以前的步骤如下所示&#xff1a; 1、git config --glo…

php如何逐条读取数据库,php从数据库中读取特定的行(实例)

有的时候我们需要从数据库中读取特定的数据&#xff0c;来检验用户的输入&#xff0c;这个时候需要执行的sql语句是&#xff1a;select * from table_name where idnum;需要执行这样的一个语句。那么怎样来执行这样的语句。为了执行sql语句&#xff0c;我们需要和数据库相连接$…

Java 7 vs Groovy 2.1性能比较

自从我与Grails上一次接触以来&#xff0c;我已经有两年没有使用Groovy了。 我陷入&#xff08;硬&#xff09;核心企业Java中&#xff0c;并且在后台遇到了一些性能方面的问题。 我几乎错过了学习Spock的机会&#xff0c;但是幸运的是&#xff0c; 华沙Java用户组帮助我摆脱了…

[UE4]嵌套Canvas

转载于:https://www.cnblogs.com/timy/p/9090642.html

写博客的这几个月,获益良多

1.前言 也将近过年了&#xff0c;看了那么多人搞了年会总结。自己活跃社区这几个月&#xff0c;改变了不少&#xff0c;收获也不少。就想写下这段时间写文章的一些总结&#xff0c;统计下‘成绩’&#xff0c;说下感想&#xff0c;就写了这篇文章。这次总结的关键词就是&#x…

php 注册自动登录,php – 创建第二个自动登录用户的登录页面

我有一个登录页面如下&#xff1a;Username: Password: LoginCancel在这里我的session.controller.php文件&#xff1a;基本上,我想要做的是创建第二个登录页面,自动将值传递给会话控制器并登录.例如,如果我转到login-guest.php,我会将用户名和密码的默认值和然后有一个jquery点…

Pyqt5+python+ErIC6+QT designer

Eric6安装及配置 https://blog.csdn.net/weixin_41656968/article/details/80253012 Python3.6PyQt5Eric6.0环境配置 https://blog.csdn.net/wf307388339wf/article/details/78990899 eric6新建工程编写代码操作步骤 https://jingyan.baidu.com/article/37bce2be5d29911003f3a2…

探索Apache Camel Core –文件组件

文件轮询器是解决常见IT问题的非常有用的机制。 Camel的内置file组件非常灵活&#xff0c;并且有许多选项可用于配置。 让我们在这里介绍一些常用用法。 轮询输入文件的目录 这是典型的骆驼Route用于每秒轮询一次目录以查找输入文件。 import org.slf4j.*; import org.apache…

shiro 权限 URL 配置细节

转载于:https://www.cnblogs.com/hwgok/p/9100277.html

2016 年崛起的 JS 项目

本文是我对中文版 risingstars2016 的整理&#xff0c;而本人就是中文版的译者&#xff0c;首发于知乎专栏 前端周刊。共 21384 字&#xff0c;读完需 30 分钟&#xff0c;速读需 5 分钟。长江后浪推前浪&#xff0c;如果你能花 30 分钟读完我 6 个小时翻译的内容&#xff0c;相…

NPOI之Excel——设置单元格背景色

NPOI Excel 单元格颜色对照表&#xff0c;在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置&#xff0c;FillPattern 为单元格背景色的填充样式。NPOI Excel 单元格背景颜色设置方法&#xff1a; 123456ICellStyle style …

php 开启命令模式,如何启用PhpStorm中的命令行工具

本篇文章主要给大家介绍如何使用phpstorm中的命令行工具。PhpStorm下载地址&#xff1a;PhpStorm使用命令行工具&#xff0c;我们可以直接从IDE调用命令&#xff01;在我们使用任何命令行工具之前&#xff0c;我们必须在设置中启用它。涉及到的步骤如下&#xff1a;使用命令行工…

深入了解Java 8中的可选类API

作为Java程序员&#xff0c;我们所有人都经历了以下情况&#xff1a;我们调用一个方法来获取某个值&#xff0c;然后代替直接对返回值调用某些方法&#xff0c;我们首先必须检查返回值不为null&#xff0c;然后在返回值。 这是像Guava这样的外部API试图解决的难题 。 此外&…

CentOS7安装及配置vsftpd (FTP服务器)

CentOS7安装及配置vsftpd (FTP服务器) 1、安装vsftpd 1 yum -y install vsftpd 2、设置开机启动 1 systemctl enable vsftpd 3、启动ftp服务 1 systemctl start vsftpd.service 4、打开防火墙&#xff0c;开放21端口 1 firewall-cmd --zonepublic --add-port21/tcp --permanent…

React Native项目自动化打包发布

今天这篇文章的目的是在rn项目的构建&#xff0c;并不会涉及到rn框架或者使用的讲解&#xff0c;说起构建&#xff0c;特别是前端构建大家应该很快会想到webpack、Grunt、 Gulp等。而这些工具在rn项目中就显得有些鸡肋。所以在此给大家分享一下不使用构建工具实现rn项目自动化打…

Python程序员之面试必回习题

写在前面 近日恰逢学生毕业季&#xff0c;课程后期大家“期待苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充&#xff0c;专挑班里不爱说话就的同学回答】。 期待的是可以检验自己学习的成功&#xff1b;苦逼的是…

如何用正则表达式杀死Java

我们最近偶然发现了一个我们绝对不了解的现象&#xff1a;您可以使用简单的正则表达式杀死任何Java IDE以及任何Java进程… 回到大学后&#xff0c;我被告知正则表达式&#xff08;称为正则语法或3型语法&#xff09;总是以有限状态的自动机结束&#xff0c;因此可以在线性时间…

php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案

Nextcloud 14或者15 无法打开登录界面出现错误信息如下&#xff1a;内部服务器错误服务器不能完成你的请求。如果再次发生&#xff0c;请在下方将技术详情发送给服务器管理员。更多细节可以在服务器日志中找到.技术细节远程地址: 210.22.126.186请求 ID: kSPvbdWDU7yvwng3516v请…

开发VUE使用第三库,发现有bug怎么办?

写在前面 本文只针对使用vue技术栈&#xff0c;进行讨论。 正文 使用vue技术栈开发&#xff0c;难免会使用第三库&#xff0c;这大大提高了我们开发的效率。然而&#xff0c;这是第三方库有bug怎么办&#xff1f; 既然有bug&#xff0c;就是现有功能没有达到预想效果。除了&a…