一. 基于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