python-tornado-异步

本文探讨了在Tornado中实现异步的三种方法:基于gen.coroutine、线程以及使用Celery分布式任务队列。gen.coroutine适用于Tornado生态,线程适合小负载异步,而Celery则为复杂任务提供了强大的异步处理能力,结合RabbitMQ作为消息中间件和任务结果存储,实现分布式任务执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 基于gen.coroutine实现异步

  • 需要依赖大量的基于 Tornado 协议的异步库,使用上比较局限

二. 基于线程实现异步

  • ThreadPoolExecutor是对标准库中的 threading 的高度封装,利用线程的方式让阻塞函数异步化,解决了很多库是不支持异步的问题。
  • 但如果大量使用线程化的异步函数做一些高负载的活动,会导致该 Tornado 进程性能低下响应缓慢,所以适合处理一些小负载的工作。
  • 但是明明知道这个函数中做的是高负载的工作,那么你应该使用 Tornado 结合 Celery 来实现异步非阻塞。

三. 使用Celery (适合处理复杂任务)

python—Celery异步分布式:https://blog.51cto.com/huangzp/2052713

Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。

  • 我们通常使用它来实现异步任务(async task)和定时任务(crontab)。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。

  • 我们需要一个消息队列来下发我们的任务。首先要有一个消息中间件(Broker),此处选择rabbitmq (也可选择 redis 或 Amazon Simple Queue Service(SQS)消息队列服务)。推荐 选择 rabbitmq 。

  • 任务执行单元 Worker: Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。

  • 任务结果存储 Backend: Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, redis 和 MongoDB 等。

它的架构组成如下图:
在这里插入图片描述
任务队列:任务队列是一种在线程或机器间分发任务的机制。

消息队列:消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。

实例学习:
分布式队列神器 Celery
https://www.rapospectre.com/blog/celery-user-guide

参考文章

1、真正的异步非阻塞:(后半部分待理解)
https://juejin.im/post/588e0de45c497d0056cadcbf
2、异步协程coroutine原理:(待深入理解)
https://www.jianshu.com/p/d63a0ab93805
3、Tornado异步原理详析(待学习)
https://www.jianshu.com/p/de7f04e65618

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值