我想知道當沒有IO線程處理異步調用的結果時會發生什麼。假設你做了一個異步web請求(在服務器應用程序中,所有的異步代碼都由線程池處理)。操作系統會發出信號,告訴您何時有結果,何時需要IO線程從套接字讀取字節。如果沒有IO線程可用,因爲這些線程都在使用中(全部含義由線程池設置的最大值)會發生什麼情況?有信號可以等待,直到有線程可用的隊列嗎?還是信號只是聞所未聞?如果後者發生,等待等待的代碼會發生什麼?如果沒有IO線程來處理異步結果,會發生什麼情況?
回答
除非您限制了線程池,否則它將根據需要創建新的I/O線程。信號以類似隊列的結構等待,稱爲I/O Completion Port (IOCP),直到它被檢索到;信號不會丟失。
線程池具有IO(和worker)線程數的最大值。你說它會超過這個價值來處理這些信號?或者只是如果我們不是最大的一個新的線程將被創建,否則它坐落在IOCP隊列中? – shortspider
不,它不會超過限制,但如所暗示的那樣,它將排隊等待輪到它,並且如果IO線程的數量受到限制,等待時間將會延長 –
讓我們回到更早的時候,當OS
使用初步和沒有的concurrency
很大餘地,那麼,如果你打開多個應用程序,這需要IO
像Excel, Word, Pdf, Ppt
,系統將顯示爲紅,反應遲鈍,因爲它不能將它們全部處理在一起,但是如果你停止排隊請求更多,並且系統不會崩潰,那麼你將看到所有這些人都有機會,並且他們再次活躍起來。
這是IO requests
已被排隊等待處理的典型用例,它們中的任何一個都不會丟失,直到並且除非系統崩潰,由於其實現的魯棒性,現在不會經常發生,記住藍色死亡的屏幕,這仍然可以發生,這是IO請求丟失的唯一一點。
實際上,Windows中線程的本質就是在併發性之前引入健壯性,這樣排隊等待處理的東西就不會丟失。在任何時候,它都會超出限制以創建超過所需數量的線程
- 1. 如果未處理事件會發生什麼情況?
- 2. 如果在Application_Start中引發未處理的異常,會發生什麼情況?
- 3. 如果沒有SD卡,會發生什麼情況?
- 4. 如果finally塊引發異常,會發生什麼情況?
- 5. 如果CFile :: Write引發異常會發生什麼情況?
- 6. 如果我的IExceptionPublisher引發異常,會發生什麼情況?
- 7. 如果未捕獲到異常,會發生什麼情況?
- 8. 如果DTD鏈接無處可逃,會發生什麼情況?
- 9. 如果我從來沒有用ThreadSafeClientConnManager調用closeExpiredConnections,會發生什麼情況
- 10. 如果printf沒有處理,會發生什麼
- 11. 如果用戶沒有安裝Youtube應用程序,會發生什麼情況?
- 12. 如果有人拿到我的appsecret,會發生什麼情況?
- 13. 如果正在處理的活套正在退出,會發生什麼情況?
- 14. 如果TestFlight會話沒有以「會話結束」日誌結束,會發生什麼情況?
- 15. 如果服務停止,後臺線程會發生什麼情況?
- 16. 如果某個線程死於臨界區域內會發生什麼情況?
- 17. 如果我在asp.net中創建線程,會發生什麼情況?
- 18. 如果我分離已加入的線程會發生什麼情況?
- 19. 如果從主線程外部調用dispatch_main,會發生什麼情況?
- 20. 如果iOS分發證書過期會發生什麼情況?
- 21. 如果沒有線程正在等待併發送條件信號,會發生什麼情況?
- 22. 如果某些線程比其他線程首先結束會發生什麼情況?
- 23. 如果java flyway移植引發異常,會發生什麼情況?
- 24. 如果我在after_fork中沒有$ redis = Redis.new,會發生什麼情況?
- 25. Azure功能 - 未處理消息而沒有輸出結果會發生什麼?
- 26. 如果任何異常情況發生
- 27. 如果php.ini丟失,會發生什麼情況?
- 28. minimax:如果min不起作用會發生什麼情況
- 29. 如果您打破Lock()語句,會發生什麼情況?
- 30. 如果NSURLCache已滿,會發生什麼情況?
當您要求計算機執行太多操作時會發生這種情況:它只會減慢速度。這是非常深埋,實際上不是CLR的一部分,[IHostIOCompletionManager接口](https://msdn.microsoft.com/en-us/library/ms164490(v = vs.110).aspx)可以完成工作。取決於你使用的主機。在實踐中,假設SetMaxThreads()的* completionPortThreads *參數完全被忽略,同時執行的*(未等待)io完成的最大數量等於處理器內核的數量通常是安全的。 –