我讀過C10K doc以及關於擴展套接字服務器的許多相關論文。所有道路指向以下:帶epoll的TCP服務器的線程和縮放模型
避免「每個連接線程」的經典錯誤。
優先選擇epoll。
同樣,unix中遺留的async io機制可能很難使用。
我的簡單TCP服務器只是偵聽專用端口上的偵聽套接字上的客戶端連接。在收到新的連接後,解析請求併發迴響應。然後優雅地關閉套接字。
我想我對如何在單線程上使用epoll進行擴展有很好的把握。只需一個循環,即爲listen套接字以及現有客戶端連接調用epoll_wait。返回時,代碼將處理新的創建新客戶端連接以及根據剛獲得信號的套接字管理現有連接的狀態。可能還有一些邏輯來管理連接超時,優雅地關閉套接字,併爲每個連接高效地分配資源。看起來很簡單。
但是如果我想擴展這個來利用多線程和多個cpu核心呢?想到的核心思想是:
一個專用線程用於偵聽TCP偵聽套接字上的傳入連接。然後是一組N個線程(或線程池)來處理所有活動的併發客戶端連接。然後創建一些線程安全的方式,讓listen線程將新的連接(套接字)「分派」給一個可用的工作線程。 (Windows中的ala IOCP)。工作線程將在它正在處理的所有連接上使用epoll循環來執行單線程方法。
我在正確的軌道上嗎?或者是否有一個標準的設計模式,用於在多個線程上使用epoll 來執行TCP服務器?
有關如何偵聽線程將派發新的連接到線程池的建議?
如果你選擇的語言是靈活的,你可能想嘗試http://vibed.org/,它抽象了異步編程的異步特性,所以你仍然可以同步編程。 例如 ubyte [] buf = new ubyte [](1024); auto data = conn.read(buf); conn.write(data); – rmc