admin select 2 异步_Python 异步任务框架Celery 使用总结

简介

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列,同时也支持任务调度。Celery 用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程,一般我们可以使用RabbitMQ或redis ,官方推荐使用RabbitMQ,而处理结果我们可以使用redis。消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。 Celery 系统可包含多个职程和中间人,以此获得高可用性和横向扩展能力。

Celery 是用Python 编写的,但协议可以用任何语言实现。迄今,已有 Ruby 实现的 RCelery 、node.js 实现的 node-celery 以及一个 PHP 客户端。

基本原理

Celery作为一个异步任务框架,其基本原理都是使用任务队列来实现,Celery本身不包含消息队列,在使用中我们一般选择RabbitMQ来实现。通常使用一个叫broker(中间人)来协调client(任务的发出者)和worker(任务的处理者),client发出消息到队列中,broker将队列中的信息派发给worker来处理,一个Celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。

安装

我们可以一次执行安装多个celery 所需的依赖,像broker, backend以及常用的序列化工具,执行以下命令进行安装:

  pip install celery[librabbitmq,redis,auth,msgpack]

Celery使用rabbitmq作为broker, 我们需要创建一个rabbitmq用户, 一个虚拟主机, 并且允许这个用户访问虚拟主机:

cd /opt/

yum install -y epel-release

yum install -y erlang

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm

yum install -y rabbitmq-server-3.6.10-1.el7.noarch.rpm

 systemctl start rabbitmq-server

 systemctl enable rabbitmq-server

 rabbitmq-plugins enable rabbitmq_management  # 启动rabbitmq的web端监控界面

 # 添加rabbitmq的admin用户,授予最高权限

sudo rabbitmqctl add_user admin admin

sudo rabbitmqctl set_user_tags admin administrator

sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

配置

 # 使用RabbitMQ作为消息代理
 BROKER_URL = 'amqp://admin:admin@localhost:5672/'
 
 # celery 启动时要导入的模块列表
 CELERY_IMPORTS = ('myapp.tasks', )
 
 # 把任务结果存在Redis
 CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
 
 # 任务序列化和反序列化使用msgpack方案
 CELERY_TASK_SERIALIZER = 'msgpack'  
 
 # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
 CELERY_RESULT_SERIALIZER = 'json'  
 
 # 指定接受的内容类型
 CELERY_ACCEPT_CONTENT = ['json', 'msgpack']  

以上是我们使用Celery 的常用配置信息,更多配置详情请参考 Celery配置 

定义一个应用

Celery库必须在使用前进行实例化,此实例称为应用程序(或简称app),该应用程序是线程安全的,因此具有不同配置,组件和任务的多个Celery应用程序可以在同一个进程空间中共存。

 from celery import Celery
 
 # 定义一个应用并用async_tasks 模块中加载所有的任务,‘async_tasks’ 模块名称您可以根据您需要进行命名
 app = Celery("async_tasks")
 
 # 加载celery 配置
 app.config_from_object("path_to_celery_config")
 
 # 定义一个 task
 @app.taskdef add(x, y):
return x + y
 

   if __name__ == '__main__':

       app.start()

调用Task

celery 调用task 有三种方式:

1. apply_async(args[, kwargs[, …]]) ,这种方式会往消息队列发送消息, 并支持各种参数使用

2. delay(*args, **kwargs) ,是apply_async 一种简明调用方式,但是不支持很多额外的参数

3. calling ( __call__) , 应用支持调用API的对象(例如add(2,2) )意味着任务将在当前进程中执行,而不是由worker执行(不会发送消息)

示例:

 说明:本例中的T 即为 task 名称
 
 # 相当于apply_async 的简单调用方式
 T.delay(arg, kwarg=value)
 
 T.apply_async((arg, ), {'kwarg': value})
 
 # 任务会在10s 后开始执行
 T.apply_async(countdown=10)
 
 # 任务会在 now 之后的10秒开始执行
 T.apply_async(eta=now + timedelta(seconds=10))
 
 # 任务会在一分钟之后执行,在两分钟后过期
 T.apply_async(countdown=60, expires=120)
 
 # 任务会在now之后的两天过期
 T.apply_async(expires=now + timedelta(days=2))

Linking Celery支持将任务链接(Linking)在一起,以便一个任务跟随另一个。回调任务将与父任务的结果一起作为部分参数应用:

 # 这里第一个任务的结果(4), 将被发送到一个新的任务中,并与第二个任务中的16得值相加然后计算出最后的结果20,形成类似于(2 + 2) + 16 = 20
 add.apply_async((2, 2), link=add.s(16))

消息发送重试(Message Sending retry) 如果连接失败,Celery将自动重试发送消息,并且可以配置重试策略, 例如重试频率, 最大重试次数, 或者一起禁用。

 add.apply_async((2, 2), retry=True, retry_policy={
    'max_retries': 3,
    'interval_start': 0,
    'interval_step': 0.2,
    'interval_max': 0.2,

 })

获取任务处理结果 一般我们使用异步任务来处理那些比较耗时的工作,可能不关心处理结果,但有时候我们还需要任务处理结果来进行一些其他的处理。要获取任务处理结果,我们首先要拿到任务执行的task_id, 然后根据这个id我们在获取结果。

 task_result = None
 
 task_id = add.delay(2, 2)
 result = AsyncResult(task_id)
 if result.successful():
task_result = result.get()

 8b6585b762472abaea344fced2a777ba.gif

了解新钛云服

新钛云服与AWS联合举办的“混合云与云治理专家研讨会”圆满结束!

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

原电讯盈科中国区副总裁加入新钛云服「附专访」

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

新钛云服出品的部分精品技术干货

万字长文:云架构设计原则|附PDF下载

如何将业务迁移到AWS上

AWS S3六项存储类别详解,从成本到访问频率

AWS EC2的价格模型

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

维人的终身成长,从清单管理开始|万字长文!

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

786599c8783747a23bf8dce5f6b0c903.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值