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方案構建分布式任務隊列系統。