tornado前端
Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架,由FriendFeed公司在本身的網站FriendFeed中使用,
被Facebook收購之後框架在2009年9月以開源軟件形式開放給大衆。
特色:
做爲Web框架,是一個輕量級的Web框架,相似於另外一個Python web框架Web.py,其擁有異步非阻塞IO的處理方式。
做爲Web服務器,Tornado有較爲出色的抗負載能力。
性能: Tornado有着優異的性能。它試圖解決C10k問題,即處理大於或等於一萬的併發。
優勢:
少而精(輕量級框架)
注重性能優越,速度快
解決高併發(請求處理是基於回調的非阻塞調用)
異步非阻塞
websockets 長鏈接
內嵌了HTTP服務器
單線程的異步網絡程序,默認啓動時根據CPU數量運行多個實例;利用CPU多核的優點
自定義模塊
缺點:
模板和數據庫部分有不少第三方的模塊可供選擇,這樣不利於封裝爲一個功能模塊
Tornado爲了高效實現Comet/後端異步調用HTTP接口,是直接內嵌了HTTP服務器。 前端無需加apache nginx等也能夠供瀏覽器訪問;但它並無完整實現HTTP 1.1的協議,因此官方文檔是推薦用戶在生產環境下在前端使用nginx,後端反向代理到多個Tornado實例。 Tornado自己是單線程的異步網絡程序,它默認啓動時,會根據CPU數量運行多個實例;充分利用CPU多核的優點。
tornado在pycharm的安裝使用nginx
1)建立一個虛擬環境web
2)在pycharm建立項目,在pycharm中選擇剛纔的虛擬環境數據庫
3)打開終端輸入以下的內容:apache
打印第一hello world後端
# coding:utf-8 import tornado.web import tornado.ioloop class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello Itcast!") if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) app.listen(8000) tornado.ioloop.IOLoop.current().start()
結構:瀏覽器
分開處理也能夠,可是必需要有視圖函數,url,主函數。服務器
封裝模塊講解:websocket
1. tornado.web tornado的基礎web框架模塊
RequestHandler網絡
封裝了對應一個請求的全部信息和方法,write(響應信息)就是寫響應信息的一個方法;對應每一種http請求方式(get、post等),把對應的處理邏輯寫進同名的成員方法中(如對應get請求方式,就將對應的處理邏輯寫在get()方法中),當沒有對應請求方式的成員方法時,會返回「405: Method Not Allowed」錯誤。
Application
Tornado Web框架的核心應用類,是與服務器對接的接口,裏面保存了路由信息表,其初始化接收的第一個參數就是一個路由信息映射元組的列表;其listen(端口)方法用來建立一個http服務器實例,並綁定到給定端口(注意:此時服務器並未開啓監聽)。
tornado的核心io循環模塊,封裝了Linux的epoll和BSD的kqueue,tornado高性能的基石。
建立了一個http服務器示例並綁定到給定端口,引入httpserver
# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver # 新引入httpserver模塊 class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello Itcast!") if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) # ------------------------------ # 咱們修改這個部分 # app.listen(8000) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000) # ------------------------------ tornado.ioloop.IOLoop.current().start()
開啓多進程
# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello Itcast!") if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) http_server = tornado.httpserver.HTTPServer(app) # -----------修改---------------- http_server.bind(8000) http_server.start(0) # ------------------------------ tornado.ioloop.IOLoop.current().start()
提示:
http_server.start(num_processes=1)方法指定開啓幾個進程,
參數num_processes默認值爲1,即默認僅開啓一個進程;
若是num_processes爲None或者<=0,則自動根據機器硬件的cpu核芯數建立同等數目的子進程;
若是num_processes>0,則建立num_processes個子進程。
關於多進程
雖然tornado給咱們提供了一次開啓多個進程的方法,可是因爲:
每一個子進程都會從父進程中複製一份IOLoop實例,如過在建立子進程前咱們的代碼動了IOLoop實例,那麼會影響到每個子進程,勢必會干擾到子進程IOLoop的工做;
全部進程是由一個命令一次開啓的,也就沒法作到在不停服務的狀況下更新代碼;
全部進程共享同一個端口,想要分別單獨監控每個進程就很困難。