簡體   English   中英

select()是否可以實現單插槽讀/寫超時?

[英]Is select() Ok to implement single socket read/write timeout?

我有一個應用程序處理網絡通信與阻止調用。 每個線程管理一個連接。 我在讀取和寫入操作上添加了超時,方法是在讀取或寫入套接字之前使用select。

在處理大量套接字時,選擇已知效率低下。 但是,就單個套接字使用它還是有更高效的方法來在單個套接字調用上添加超時支持,它是否可以? 選擇的好處是便攜。

是的,這沒問題,你確實需要一些超時機制來避免來自不良行為客戶端的資源等。

請注意,擁有大量線程比選擇處理大量套接字的效率更低。

如果你選擇使用大量套接字進行選擇效率低下,請嘗試使用每個sockt一個線程來處理大量套接字。 你是一個痛苦的世界。 就像你將有問題擴展到1000個線程。

我過去所做的是:

  • 以X(512,1024)為一組的組套接字。
  • 讓一個或兩個線程沿着這些組運行並選擇() - 然后將帶有新數據的套接字交給隊列。
  • 有許多工作線程使用新數據處理這些套接字。 多少取決於我需要多少CPU最大化;)

這樣我就不用超級的超級選擇()和TONS的項目,我也不會在線程上浪費大量的內存(提示:每個線程都需要它自己的堆棧。只有2mb,即1000個插槽的2gb - 談論做無用的上下文切換,浪費了大量的CPU。

線程/選擇的問題是您是否要避免客戶端相互阻塞。 如果這不是問題,那么工作單線程。 如果是,請選擇適當的線程方案(每個連接1個線程,每個連接的工作線程,每個請求的工作線程,......)。

當每個連接使用1個線程時,每次讀/寫選擇是一個不錯的解決方案,但一般來說,最好將非阻塞套接字與select結合使用,以避免在只有部分預期消息的情況下阻塞到達然后寫完后做一個選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM