python Select\Poll\Epoll異步IO與事件驅動

參考:http://www.cnblogs.com/alex3714/articles/5248247.htmlhtml

寫服務器處理模型的程序時一般採用的模型:程序員

(1)每收到一個請求,建立一個新的進程,來處理該請求;特色:因爲建立新的進程的開銷比較大,因此,會致使服務器性能比較差,但實現比較簡單。
(2)每收到一個請求,建立一個新的線程,來處理該請求;特色:要涉及到線程的同步,有可能會面臨 死鎖等問題。
(3)每收到一個請求,放入一個事件列表,讓主進程經過非阻塞I/O方式來處理請求。特色:寫應用程序代碼時,邏輯比前面兩種都複雜。
上面的幾種方式,各有千秋,通常廣泛認爲第(3)種方式是大多數 網絡服務器採用的方式。

事件驅動模型

事件驅動模型大致思路以下:
1. 有一個事件(消息)隊列;
2. 鼠標按下時,往這個隊列中增長一個點擊事件(消息);
3. 有個循環,不斷從隊列取出事件,根據不一樣的事件,調用不一樣的函數,如onClick()、onKeyDown()等;
4. 事件(消息)通常都各自保存各自的處理函數指針,這樣,每一個消息都有獨立的處理函數;編程

事件驅動程序的執行流由外部事件來決定。它包含一個事件循環,當外部事件發生時使用回調機制來觸發相應的處理。另外兩種常見的編程範式是(單線程)同步以及多線程編程。安全

如下爲單線程、多線程以及事件驅動編程模型。下圖展現了隨着時間的推移,這三種模式下程序所作的工做。這個程序有3個任務須要完成,每一個任務都在等待I/O操做時阻塞自身。阻塞在I/O操做上所花費的時間已經用灰色框標示出來了。服務器

在單線程同步模型中,任務按照順序執行。若是某個任務由於I/O而阻塞,其餘全部的任務都必須等待,直到它完成以後它們才能依次執行。網絡

在多線程版本中,這3個任務分別在獨立的線程中執行。這些線程由操做系統來管理,在多處理器系統上能夠並行處理,或者在單處理器系統上交錯執行。這使得當某個線程阻塞在某個資源的同時其餘線程得以繼續執行。與完成相似功能的同步程序相比,這種方式更有效率,但程序員必須寫代碼來保護共享資源,防止其被多個線程同時訪問。多線程程序更加難以推斷,由於這類程序不得不經過線程同步機制如鎖、可重入函數、線程局部存儲或者其餘機制來處理線程安全問題,若是實現不當就會致使出現微妙且使人痛不欲生的bug。多線程

在事件驅動版本的程序中,3個任務交錯執行,但仍然在一個單獨的線程控制中。當處理I/O或者其餘昂貴的操做時,註冊一個回調到事件循環中,而後當I/O操做完成時繼續執行。回調描述了該如何處理某個事件。事件循環輪詢全部的事件,當事件到來時將它們分配給等待處理事件的回調函數。這種方式讓程序儘量的得以執行而不須要用到額外的線程。事件驅動型程序比多線程程序更容易推斷出行爲,由於程序員不須要關心線程安全問題。函數

IO多路複用:性能

參考http://www.cnblogs.com/alex3714/articles/5876749.html操作系統

http://www.cnblogs.com/alex3714/articles/5248247.html

相關文章
相關標籤/搜索