TaylorWu的博客
Tornado的性能改善(一):线程池的使用
编辑于:2016-07-18
导语
Tornado是一款优秀的开源Web框架,其简单易用,性能卓越等特性受到开发者的青睐。但是由于Tornado的单线程结构,假如执行耗时任务,此时线程则会阻塞,无法响应其他请求。下面就我对Tornado使用的经验,对其性能作出改善。
一. 线程池提高并发处理量
1. 使用Tornado自带的concurrent的语法糖run_on_executor。
2. 使用Python自带的concurrent的ThreadPoolExecutor线程池库。
代码区间
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
import time
class Test():
executor = ThreadPoolExecutor(10) #set up a threadpool
@run_on_executor
def longTimeTask():
print "go to sleep"
time.sleep(20) #go to sleep
print "wake up"
if __name__ == "__main__":
test = Test()
test.longTimeTask()
print "print very soon"
上述例子当中,executor为初始化的线程池对象,而Test类中的longTimeTask被语法糖run_on_executor包裹,将该函数的执行传递给线程池executor的线程执行,优化了处理耗时性任务,以致达到不阻塞主线程的效果。
其实,上述的采用线程池优化并不是最优方案。耗时任务,通常涉及IO,其中常见的操作即是写日志,写数据库等数据持久化操作。此时我们更可以采取分布式任务队列的方式来进行优化。常见的有Celery + RabbitMq + Redis方案构建分布式任务队列系统。