python异步框架twisted_twisted是python实现的基于事件驱动的异步网络通信构架。
網:https://twistedmatrix.com/trac/
http://www.cnblogs.com/wy-wangyan/p/5252271.html
What is Twisted?
Twisted is an event-driven networking engine written in Python and licensed under the open source??MIT license. Twisted runs on Python 2 and an ever growing subset also works with Python 3.
twisted是python實現的基于事件驅動的異步網絡通信構架。可以在官網上在線瀏覽twisted的源碼,也有svn可以自行下載,源碼還是比較清晰易懂的。接下來的代碼或者例子,文檔很多都來源于官網介紹。
第一個問題是為什么項目叫twisted? ? 我的理解是由于構成twisted的主要構件deferred list, 有兩個回調鏈,如圖所示,回調鏈每一項包含一個(callback,errback)對。twisted按照回調鏈從第一個callback開始執行,如果出錯執行下一個回調函數對應的errback,如果執行成功,再回到下下個callback繼續執行。是不是很twisted?
第二個問題是什么是基于事件驅動的異步網絡框架?
我們寫過網絡通信程序的都熟悉socket, 都知道select/poll/epoll這些網絡多路復用程序,都對應著讀或者寫操作,twisted的構成中包含一個reacotor的東東,就是很多異步事件框架都有的概念反應堆模式,這是個單例模式,同一時間內只有一個reactor在運行。reactor.run(), 我們說的基于事件就是這樣的一個事件循環,twisted等待事件就緒,然后調用回調函數,返回結果。當然它是基于select/poll/epoll的輸入輸出(讀、寫)事件。
關于反應堆模式: 請移步這里,這個大牛的翻譯:http://www.cnblogs.com/pugang/p/4621373.html
那么什么又是異步? 同樣的,我們知道網絡通信有幾個模式,在各種面試中也或有問到,關于同步,異步,阻塞,非阻塞的區別。
關于這個解釋的文章很多,權威的請參考《unix網絡編程》中關于unix網絡i/o模式的描述。說說我自己的理解,在Linux中所有都是文件,socket當然也是,網絡i/o是i/o的一種嘛。我們的應用程序也要包含兩部分的內容,一個是用戶態一個是內核態的內核調用。網絡i/o包含了兩部分的內容:
1. 應用程序陷入內核態等待數據就緒
2. 將數據從內核空間復制到用戶空間。
阻塞就是在這兩個階段都在等待,都被block了,一直等待內核的返回。
非阻塞就是我們熟悉的socket.setblocking(0),或者fnctl設置的非阻塞flag;它只是在第二個階段阻塞了,在一個階段,應用程序知道數據未準備好后,立刻返回錯誤碼EAGAIN/EWOULDBLOCK,知道數據準備結束,復制完畢后返回。
同步指的是等待I/O操作的完成。
異步指的是不必等待I/O操作完成,直接返回,等到第二階段完成后,內核主動通知進程結束。
所以你說區別,我覺得就是阻塞/非阻塞對應的是一個當前的一個狀態,同步/異步著眼于整個大局或操作。
我們今天是要說事件驅動的,前面說了我們依賴于select/poll/epoll,他們都是網絡多路復用i/o,用了它們不需要再建多線程,線程池這些東西就能同時監控多個fd。有人叫它們異步(同步)非阻塞I/0, 但是從實際上來說,他們也是同步阻塞的,select/poll/epoll阻塞在select(), epoll.wait()這些函數中,等到數據就緒,然后開始第一個階段,然后第二個階段,在第二個階段中也是I/O阻塞的嘛,所以說它們阻塞在了兩個地方,而且需要等待I/O操作的完成。那到底有沒有異步I/O,異步I/O需要操作系統底層的支持,目前好像還沒有滿意的異步I/O,有一些實現也是基于線程/線程池模擬實現。
那twisted既然用到了select/poll/epoll,它為什么叫基于事件的異步框架。因為它模式了異步I/O,它使用reactor模式處理事件循環,使用deferred處理回調函數,用戶可以自己寫一個回調函數,然后放到deferred list中,twsited會在事件通知就緒后調用這些回調函數,執行完畢,返回結果。看,是不是異步I/O。其它的一些基于事件的異步框架,像java的netty也是這樣模擬的。
今天寫到這里,下一篇準備分析select/epoll這些多路復用I/O,再從socket/epoll的例子入手,開始twisted的講解。有錯誤之處,敬請指正,共同學習
總結
以上是生活随笔為你收集整理的python异步框架twisted_twisted是python实现的基于事件驱动的异步网络通信构架。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片去字工具_这些免费工具轻松提取图片中
- 下一篇: cf体验服_CF手游体验服_穿越火线枪战