編程學習網 > 編程語言 > Python > Python Tornado異步編程教程
2023
09-09

Python Tornado異步編程教程

Python很多框架都是同步阻塞框架,比如Django以及Flask等,這對高并發要求不太高的企業是合適的,但是一旦公司面臨的請求是數以萬計的,那么以上框架就顯得力不從心,必須搭配Nginx等web server才能扛住一定的流量,那有沒有一個框架本身可以提供異步編程并且同時提供類似Nginx這樣的工作呢?答案是有的,那就是Tornado!


2. Tornado異步編程示例
import asyncio
import tornado.web

class asyncIndexHandler(tornado.web.RequestHandler):
    async def get(self): # 協稱 但是里面邏輯可以按照同步方式去寫就行
        self.write("hello world")
        self.finish()

if __name__ == "__main__":
    app = tornado.web.Application(handlers=[
        (r"/async", asyncIndexHandler)
    ], settings={"debug": True})
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8000)
    # tornado.ioloop.IOLoop.instance().start() //tornado本身的事件循環機制
    asyncio.get_event_loop().run_forever() # 利用asyncio的事件循環機制
我們看到這里本來可以使用tornado本身的事件循環機制的,但是因為一旦使用了它,那么許多基于asyncio的第三方包可能用不了,比如aioredis,aiohttp以及aiomysql等,所以我們這里使用asyncio的事件循環機制。

3. tornado高效原因
底層采用異步非阻塞io
tornado對socket的使用,都是非阻塞io,從下往上跟我們傳統的編程都是不一樣的,所以在我們沒有理解透的時候,去使用tornado會踏入很多誤區,我們傳統的編程,將我們很多耗時的操作,是直接拋給我們線程去操作的,這個線程如果由我們程序員自己去調度是非常麻煩的,但是因為操作系統本身已經提供了對線程的調度,所以我們在使用線程的時候,使用難度都已經降低了不少,這才使得我們多線程使用起來是比較簡單的,但是協程的話,操作系統是不提供的,所以協程的調度,就需要我們程序員自己來完成,一般現在都是框架來完成的,像我們Python3實現的asyncio,就是完成了協程的調度,所以我們需要去了解協程的調度,這樣才能寫出高效優秀的代碼。

基于epoll事件循環
這也是最核心的一個功能,像我們Nginx它并發的原理,底層也是epoll事件循環,當然這里的epoll是Linux下的epoll,Windows是select,這也就是為什么Nginx是部署在Linux系統,為什么現在服務器都是Linux系統的原因。

協程提高了代碼的可讀性
協程是一步一步發展而來的,這個我們之前講過,從最開始的時候,為解決我們線程并發,采用了回調的模式,但是回調模式可讀性差(回調地獄),我們也就一步步發現了協程的模式,以同步的模式去寫異步的代碼,這樣寫代碼效率反而增加了,必須點贊。

4. 小結
Tornado本身有很多值得我們去探究的技術原理,但是由于篇幅有限,我只能講解下它與asyncio以及Python原生協稱的配合使用,這也與我們異步編程課程安排相關,所以不會涉及到很多Tornado的相關知識,大家下去自行研究。另外我們的技術在企業中是以框架為基礎展開的,所以學好異步框架是非常有必要的。

后期會出一個基于Tornado的異步高性能框架,只需要三四行就能寫出優雅的接口,我們拭目以待吧。

以上就是Python Tornado異步編程教程的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取