面試知識點雜記

(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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章