Python非同步io的Web框架-Sanic源碼分析(核心篇)

Sanic源碼分析(核心篇)

本次分析只針對Sanic的核心部分進行分析,了解Sanic從接受一個請求到返迴響應的全過程,基於的版本0.1.2

項目結構

  • server 一個基於asyncio的Protocol的協議 sanic的核心,裡面有收到請求到返迴響應的鉤子
  • requset sanic的請求對象 內有對form args json 的處理
  • response Sanic的響應對象
  • router Sanic的路由管理
  • Sanic Sanicapp的啟動 添加路由的對象

整體流程

  1. sever接受到請求,觸發接受請求的鉤子
  2. 鉤子內部使用httptools進行http解析,生成request對象
  3. 通過路由關係尋找到對應的處理函數,處理requset 生成response
  4. 把response寫入

源碼分析

定義server服務

class HttpProtocol(asyncio.Protocol):

裡面有些要寫的方法。具體參考Asyncio的Protocol的文檔

啟動服務

根據Protocl對象啟動一個服務

server_coroutine = loop.create_server(lambda: HttpProtocol( loop=loop, connections=connections, signal=signal, request_handler=request_handler, request_timeout=request_timeout, request_max_size=request_max_size, ), host, port) http_server = loop.run_until_complete(server_coroutine) loop.run_forever()

獲取數據的鉤子

這個方法來源asyncio的protocol部分,獲取數據後, 使用httptools解析,並填充requset

def data_received(self, data): if self.parser is None: assert self.request is None self.parser = httptools.HttpRequestParser(self) self.parser.feed_data(data)

有很多類似

def on_url(self, url): self.url = url

的方法就是使用httptools解析request並填充,具體參考httptools

處理requset

def on_message_complete(self): self.loop.create_task(self.request_handler(self.request, self.write_response))

requset_handler 是來源router的對應關係,這裡暫時把router理解成一個URL和函數對應的字典

寫返回值

這個方法由request_handle調用,發送respon並且關閉通訊

def write_response(self, response): self.transport.write(response.output(self.request.version, keep_alive, self.request_timeout)) keep_alive, self.request_timeout)) self.transport.close()

總結

至此Sanic的核心邏輯就結束了,結構十分清晰簡單,是對python的非同步io的一次十分棒的應用。 為什麼Sanic性能這麼高,主要是幾個原因:

  1. 非同步io架構的天然優勢
  2. sanic把eventloop從async替換成了uvloop
  3. http解析器採用的高性能的httptools

參考資料

【1】.Protocol

【2】. httptools

【3】.sanic

推薦閱讀:

左手用R右手Python系列之——表格數據抓取之道
用Python-Markdown和google-prettify來處理Markdown和代碼高亮
Python · 神經網路(三)· 網路
《機器學習實戰》學習總結(五)——Logistic回歸
R & Python-機器學習演算法速查表

TAG:Python | Web开发 | 编程 |