今天我們開始入新坑Tornado,學習和Flask不一樣的web開發(fā)框架。一起加油。。。
我們先看下百度百科上關于tornado的介紹:
Tornado是一種 Web 服務器軟件的開源版本。Tornado 和現(xiàn)在的主流 Web 服務器框架(包括大多數(shù) Python 的框架)有著明顯的區(qū)別:它是非阻塞式服務器,而且速度相當快。
得利于其非阻塞的方式和對epoll的運用,Tornado 每秒可以處理數(shù)以千計的連接,因此 Tornado 是實時 Web 服務的一個 理想框架。
是為了解決高并發(fā)和長連接而生的一個框架。
tornado的一些特點:
tornado除了是一個web框架外還是一個web服務器
tornado包括了異步http客戶端
AsyncHttpClient,因為tornado還可以做一些高并發(fā)的請求tornado的web框架是一個非常小的web框架的核心,類似flask
tornado是天然支持長連接的(聊天,推送)
我們看下老師一個手記來看下Django,Flask和Tornado的區(qū)別:https://www.imooc.com/article/24759
tornado的優(yōu)勢:
- 提供了異步編碼的一整套方案,即不僅是一個web開發(fā)框架,還包括了一整套的
http協(xié)議和websocket協(xié)議的庫。 - tornado不只是web框架,也是web服務器。
- tornado是基于協(xié)程的解決方案。
- tornado提供websocket的長連接(web聊天,消息推送)
tornado是如何做到高并發(fā)的呢?
tornado的核心底層就是利用協(xié)程和高效的epoll事件循環(huán)來完成的。使用協(xié)程會比使用線程的系統(tǒng)開銷省很多。
- 使用了異步非阻塞IO (重點在于理解協(xié)程的調(diào)度)
- 基于
epoll的事件循環(huán)(nginx的并發(fā)底層也是使用了linux的epoll) - 協(xié)程提高了代碼的可讀性(同步模式寫異步代碼)
一些對tornado的誤解:
- tornado提供的只是web框架
- 只要用tornado就是高并發(fā)(必須了解什么是協(xié)程,什么是事件循環(huán))
- 直接在tornado中使用了大量的同步io
- tornado只需要將耗時的操作放到線程池中就可以達到高并發(fā)
- tornado中多線程和協(xié)程的單線程是不是沖突?(不是,再tornado中會有一個主線程完成協(xié)程的事件循環(huán),也有一個線程池將耗時的任務放到線程池中即使用同步IO)
盡量使用async和await而不是coroutine裝飾器和yield from
理由:
-
coroutine是一個從生成器過渡到協(xié)程的方案。 -
yield和await的混合使用造成代碼的可讀性很差 - 生成器可以模擬協(xié)程,但是生成器應該做自己!
- 原生協(xié)程總體來說比基于裝飾器的協(xié)程快
- 原生協(xié)程可以使用
async for和async with更符合Python風格 - 原生協(xié)程返回的是一個
awaitable的對象,裝飾器的協(xié)程返回的是一個future
文檔:
最新5.1.1英文文檔:https://www.tornadoweb.org/en/stable/guide/intro.html
4.3中文文檔:https://tornado-zh.readthedocs.io/zh/latest/
我們使用Tornado的重點是理解協(xié)程,下節(jié)開始我們再重溫一下協(xié)程吧!