網路程式設計 使用poll單執行緒處理所有I O事件

2022-10-09 13:00:13 字數 1228 閱讀 6394

事件驅動的好處:占用資源少,效率高,可擴充套件性強,是支援高效能高併發的不二之選。

事件驅動模型也叫作反應堆模型(reactor),或者是event loop模型,該模型的核心有兩點:

任何乙個網路程式,所有的事情可以總結成以下幾種:

fork

使用fork建立子程序,為每個到達的客戶連線服務,如下圖,隨著客戶數的增多,fork的子程序也越來越多,即使客戶和伺服器之間的互動比較少,這樣的子程序也不能被銷毀,一直需要存在。雖fork的處理方式簡單,但處理效率不高,fork子程序的開銷太大。

使用了 pthread_create 建立子執行緒,因為執行緒是比程序更輕量級的執行單位,所以它的效率相比 fork 的方式,有一定的提高。但是,每次建立乙個執行緒的開銷仍然是不小的,因此,引入了執行緒池的概念,預先建立出乙個執行緒池,在每次新連線達到時,從執行緒池挑選出乙個執行緒為之服務,很好地解決了執行緒建立的開銷。但是,這個模式還是沒有解決空閒連線占用資源的問題,如果乙個連線在一定時間內沒有資料互動,這個連線還是要占用一定的執行緒資源,直到這個連線消亡為止。

乙個reactor執行緒上同時負責分發acceptor的實踐、已連線套接字的i/o事件。

上述的設計模式有個問題,和i/o事件處理相比,應用程式的業務邏輯處理是比較耗時的,比如xml文字的解析、資料庫記錄的查詢、檔案資料的讀取和傳輸、計算型工作的處理等,這些工作相對比較獨立,它們會拖慢整個反應堆模式的執行效率。

因此,可將decode、compute、encode型工作放置到另外的執行緒池中,和反應堆執行緒解耦,是乙個比較明智的選擇。

反應堆執行緒只負責處理i/o相關的工作,業務邏輯相關的工作都被裁剪成乙個乙個的小任務,放到執行緒池裡由空閒的執行緒來執行。當結果完成後,再交給反應堆執行緒,由反應堆執行緒通過套接字將結果傳送出去。

python單執行緒網路爬蟲

源程式 以網為例 coding utf8 importrequests importre importsys reload sys sys.setdefaultencoding gb18030 type sys.getfilesystemencoding html requests.get html...

MFC簡單執行緒使用

執行緒並不是mfc的,只是為了分類,所有加個標題,望誤解 因為上篇說到串列埠,那就離不開執行緒了,第一,需要不斷重新整理串列埠接收的資料 第二,需要不斷重新整理串列埠連線狀態 必要時自動斷開和連線 那麼就需要2個執行緒來服務這個串列埠了 這裡使用簡單的建立方法,和linux的c執行緒類似 子執行緒函...

linux c單執行緒I O超時處理

單執行緒i o超時處理 unix下的i o超時處理是乙個很常見的問題,它的通常做法是接收輸入 或傳送輸出 後立刻返回,如果無輸入 或輸出 則n秒後定時返回.一般情況下,處理unix中i o超時的方式有終端方式,訊號跳轉方式和多路復用方式等三種.本節設計乙個定時i o的例子,它從檔案描述符0中讀取乙個...