1. 程式人生 > >事件驅動實現單執行緒實現併發 真正的高效併發

事件驅動實現單執行緒實現併發 真正的高效併發

單執行緒併發其實本質就是事件驅動加上非同步系統呼叫。 這個在7年前就像做過,但是鑑於工作不需要也就沒有去實現。 最近幾年某個大型儲存虛擬化系統就是事件驅動,而且一個cpu一個polling執行緒。

普通的併發實現依賴於多執行緒,然而多執行緒的切換中的上下文切換用到了使用者空間,核心空間是幾千行的核心程式碼的執行。 這個極大的浪費了系統資源。 另外,在某些比較實時的應用中,request的請求依賴於正在執行的執行緒是否yeld()。

單執行緒實現多路併發依賴於polling函式,去查詢事件,這個可以自己實現也可以用系統函式,譬如select(), epoll().   如果某個request請求的處理涉及的邏輯比較複雜,涉及到和其他模組的互動,甚至許多資料庫操作、檔案操作、socket操作等,那麼實現就會比較複雜。
1. 針對某個request創造上下文,也就是自己實現context,記住一定要有ID標記哦。

2. 對複雜request請求使用狀態機處理。 不同的步驟,對應不同的狀態。

3. 不允許有阻塞操作,如果設計到檔案、socket、資料庫等,必須使用其非同步操作,不然會阻塞polling 執行緒的執行。 

4. 非阻塞而且非同步。非阻塞還不夠,非阻塞不一定是非同步。 如果某個操作譬如資料庫操作,呼叫時候執行條件滿足於是立即執行了,但是執行時間久且在另外的節點上。於是可以非同步操作。

5. 既然是非同步,則必須有完成時的回撥函式,完成方必須給出事件或者直接回調 callback.

6.根據系統性質,確定程式碼回到polling函式的時間,確定單個任務執行的最大時間。 如果某個任務確實需要大量的程式碼和時間,那麼建議新增slow task機制。

開源事件驅動庫: ibevent,libev和libuv

http://hi.baidu.com/jakisou/item/9fa97a32b5c99d637c034bc6

系統非同步操作介紹

//linux 非阻塞 檔案讀寫I/O介紹 AIO

http://blog.csdn.net/gotosola/article/details/7411688

//linux 下檔案非同步操作介紹 AIO_read  的使用

http://blog.csdn.net/wenhuiqiao/article/details/7066267

//資料庫非同步操作, sql_server的很多操作支援非同步。

//socket支援非同步。

無堵塞併發程式設計

http://www.jdon.com/42781

http://blog.chinaunix.net/uid-22939760-id-186334.html