Q
選擇插座編程
0
A
回答
2
考慮下面的例子。你有一箇中等繁忙的網絡服務器,像100K連接。您沒有使用select
或類似的東西,因此每個連接只有一個線程,意味着100K線程很快就會成爲問題。
即使你調整你的系統,直到它允許這樣的怪物,大多數線程只會等待一個套接字。如果有一種機制讓在套接字變得有趣時通知你,這不是更好麼?
換句話說,線程和select
類似的機制是互補的。你只是不能用threads
來代替簡單的東西select
做的事情:監控文件描述符。
1
單線程輪詢使用,實現和(最重要的)明白要簡單得多。併發編程爲您的項目增加了巨大的智力成本:同步數據非常棘手且容易出錯,鎖定引入了許多錯誤機會,無鎖數據結構導致性能命中,並且程序流變得難以在思想上形象化(或「序列化」也許)。
相比之下,單線程輪詢(可能與epoll
/kqueue
而非select
)爲您提供了一般非常不錯的表現(上究竟你在響應數據正在做當然依賴的),而其餘的直線前進。
特別是在Linux中,您可以使用timerfds,eventfds,signalfds和inotify-fds以及嵌套的epoll-fds,它們都坐在您的投票集中,爲您提供了一種非常統一的處理各種「異步」事件。如果最終需要更多的性能,那麼通過同時運行多個輪詢器可以獲得單點並行性,並且內核爲您提供的大部分數據同步,它承諾只有一個單線程在事件中接收到成功的輪詢準備就緒。
相關問題
- 1. 編程插座
- 2. 選擇()上的插座與超時
- 3. Python插座字典與選擇
- 4. 掌握插座的問題,並選擇
- 5. 從插座打破了選擇
- 6. 以編程方式設置插座UIBarButtonItem
- 7. JAVA編程插座無限循環
- 8. 插座中的數組編程
- 9. 選擇下一座要排隊的遊戲 - AI遊戲編程
- 10. 遠程VS插座
- 11. php插座教程
- 12. 在非插座上的插座操作:在設置插座選項和裝訂插座時出錯
- 13. Flex插座到插座
- 14. 插座與插座集合
- 15. 插座程序設置
- 16. 插座和線程用C
- 17. 與多線程及插座
- 18. 遠程插座監聽器
- 19. 線程打開插座
- 20. POSIX線程在C插座
- 21. Python的 - 多線程插座
- 22. 線程,插座和流
- 23. 升壓線程和插座
- 24. mini210插座多線程
- 25. POSIX插座VS網絡插座VS Windows TCP/IP插座
- 26. Perl中,讀取使用IO ::選擇和IO ::插座:: INET
- 27. 選擇xcode ios上的所有插座8
- 28. 選擇()上的插座,另一事件機制
- 29. 選擇在C++中的插座不等待超時值
- 30. 選擇手錶插座fd醒來太慢
好的。我明白你在說什麼。您能否提供使用線程和選擇客戶端 - 服務器體系結構的最佳做法? – coredump
@coredump這取決於你在做什麼。 – cnicutar
這是一個文件傳輸項目。服務器託管有關客戶端的數據。實際傳輸是客戶端之間的點對點傳輸。服務器只保存主機的文件和其他數據。客戶端可以接受多個連接,並且我想傳輸部分文件然後轉到另一個連接,傳輸文件的一部分等等。 – coredump