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的啟動 添加路由的對象
整體流程
- sever接受到請求,觸發接受請求的鉤子
- 鉤子內部使用httptools進行http解析,生成request對象
- 通過路由關係尋找到對應的處理函數,處理requset 生成response
- 把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性能這麼高,主要是幾個原因:
- 非同步io架構的天然優勢
- sanic把eventloop從async替換成了uvloop
- http解析器採用的高性能的httptools
參考資料
【1】.Protocol
【2】. httptools
【3】.sanic
推薦閱讀:
※左手用R右手Python系列之——表格數據抓取之道
※用Python-Markdown和google-prettify來處理Markdown和代碼高亮
※Python · 神經網路(三)· 網路
※《機器學習實戰》學習總結(五)——Logistic回歸
※R & Python-機器學習演算法速查表