(1)linux中的epoll
IO多路複用(IO multiplexing)技術。是爲處理大批量句柄而作了改進的poll, epoll主要是用來解決網絡IO的併發問題,所以Tornado的異步編程也主要體現在網絡IO的異步上,即異步Web請求。(服務器作爲服務器,服務器作爲客戶端)異步來處理各種請求。IO多路複用技術
(2)epoll的優點
—支持一個進程打開大數目的socket描述符(FD):實際例子tornado服務器ioloop----epoll----socket(epoll打開大量的socket,解決C10K,實現高併發,HTTP長久連接問題),是Tornado不依靠多進程/多線程而達到高性能的原因(tornado服務器是單進程的)
—IO效率不隨FD數目增加而線性下降
—.使用mmap加速內核與用戶空間的消息傳遞
—內核微調
(3)linux下epoll如何實現高效處理百萬句柄的—待解決
開發高性能網絡程序時,windows開發者們言必稱iocp,linux開發者們則言必稱epoll。大家都明白epoll是一種IO多路複用技術,可以非常高效的處理數以百萬計的socket句柄,比起以前的select和poll效率高大發了。
(4)瀏覽器地址欄中輸入網址訪問的方式爲get請求方式,默認請求爲get請求方式(注意get和post方式的不同)
(5)tornado是web框架(Application)和web服務器(httpServer)一體的web操作,其是單進程、單線程的服務器,我們引入了tornado.httpserver模塊,顧名思義,它就是tornado的HTTP服務器實現。創建了一個HTTP服務器實例http_server,因爲服務器要服務於我們剛剛建立的web應用Application,將接收到的客戶端請求通過web應用中的路由映射表引導到對應的handler中,所以在構建http_server對象的時候需要傳出web應用對象app。http_server.listen(8000)將服務器綁定到8000端口。
(6)django是多線程服務器,僅僅是web服務器框架,在部署的時候需要使用nginx服務器搭配django web框架,中間通過uwsgi(wsgi)來連接,WSGI(Web Server Gate Interface)的功能就是連接web框架和web服務器的。一般都是搭配nginx+uwsgi+django web應用
(7)web框架中的反向解析,正常的解析是由路由到應用,反向解析就是通過一個標識(一般設置一個name)來得到相應的路由,然後由路由到相關的應用。反向解析的作用就是從name屬性得到路由url
(8)調用接口的總結(以tornado爲例子)
tornado即是web框架也是web服務器,做web服務器時需要處理各種http請求,作爲客戶端的時候需要請求各種數據(請求數據可以使用調接口技術也可以使用ajax技術)這兩個技術都是可以進行異步來處理的
Tornado提供了一個異步Web請求客戶端tornado.httpclient.AsyncHTTPClient用來進行異步Web請求。這種是調用接口來實現的。
fetch(request, callback=None) 用於執行一個web請求request,並異步返回一個tornado.httpclient.HTTPResponse響應。request可以是一個url,也可以是一個tornado.httpclient.HTTPRequest對象。如果是url,fetch會自己構造一個HTTPRequest對象。
HTTPRequest
HTTP請求類,HTTPRequest的構造函數可以接收衆多構造參數,最常用的如下:
--- url (string) – 要訪問的url,此參數必傳,除此之外均爲可選參數
---method (string) – HTTP訪問方式,如“GET”或“POST”,默認爲GET方式
---headers (HTTPHeaders or dict) – 附加的HTTP協議頭
---body – HTTP請求的請求體
HTTPResponse
HTTP響應類,其常用屬性如下:
code: HTTP狀態碼,如 200 或 404
reason: 狀態碼描述信息
body: 響應體字符串
error: 異常(可有可無)
測試接口
新浪IP地址庫
接口說明
1.請求接口(GET):
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=[ip地址字串]
2.響應信息:
(json格式的)國家 、省(自治區或直轄市)、市(縣)、運營商
3.返回數據格式:
{"ret":1,"start":-1,"end":-1,"country":"\u4e2d\u56fd","province":"\u5317\u4eac","city":"\u5317\u4eac","district":"","isp":"","type":"","desc":""}
從接口獲取數據在tornado中可以使用異步—回調異步和協程異步,推薦使用協程異步
回調異步:
class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous # 不關閉連接,也不發送響應
def get(self):
http = tornado.httpclient.AsyncHTTPClient()
http.fetch("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=14.130.112.24",
callback=self.on_response)
def on_response(self, response):
if response.error:
self.send_error(500)
else:
data = json.loads(response.body)
if 1 == data["ret"]:
self.write(u"國家:%s 省份: %s 城市: %s" % (data["country"], data["province"], data["city"]))
else:
self.write("查詢IP信息錯誤")
self.finish() # 發送響應信息,結束請求處理
協程異步:
class IndexHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
http = tornado.httpclient.AsyncHTTPClient()
response = yield http.fetch("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=14.130.112.24")
if response.error:
self.send_error(500)
else:
data = json.loads(response.body)
if 1 == data["ret"]:
self.write(u"國家:%s 省份: %s 城市: %s" % (data["country"], data["province"], data["city"]))
else:
self.write("查詢IP信息錯誤")
異步的執行,服務器即做服務器也做客戶端(處理很多業務需要異步的進行)使用Tornado內置的異步HTTP客戶端進行調用(異步HTTP客戶端)
(9)WebSocket
WebSocket是HTML5規範中新提出的客戶端-服務器(瀏覽器-服務器)通訊協議(創建在TCP協議上),協議本身使用新的ws://URL格式。
WebSocket 是獨立的、創建在 TCP 上的協議,和 HTTP 的唯一關聯是使用 HTTP 協議的101狀態碼進行協議切換,使用的 TCP 端口是80,可以用於繞過大多數防火牆的限制。socket用來通信
WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端直接向客戶端推送數據而不需要客戶端進行請求,兩者之間可以創建持久性的連接,並允許數據進行雙向傳送。
目前常見的瀏覽器如 Chrome、IE、Firefox、Safari、Opera 等都支持 WebSocket,同時需要服務端程序支持 WebSocket。