如果没有IO线程来处理异步结果会发生什么?
本文关键字:什么 结果 异步 IO 线程 处理 如果没有 | 更新日期: 2023-09-27 18:03:10
我想知道当没有IO线程来处理异步调用的结果时会发生什么。
假设你做了一个异步web请求(在服务器应用程序中,所以所有异步代码都由线程池处理)。当有结果时,操作系统将发出信号,当它出现时,您将需要一个IO线程从套接字读取字节。如果没有可用的IO线程,因为所有线程都在使用中(所有线程都意味着线程池设置的最大值),会发生什么?是否有一个队列,信号可以等待,直到有一个线程可用?还是说信号就这样消失了?如果发生后者,等待await的代码会发生什么?
除非您限制了线程池,否则它将根据需要创建新的I/O线程。信号在称为I/O完成端口(IOCP)的队列结构中等待,直到它被检索;信号不会丢失
让我们回到更早的时候,当OS
使用初步的,没有太多的concurrency
的范围,然后如果你打开多个应用程序,需要IO
像Excel, Word, Pdf, Ppt
,系统会出现挂起和无响应,因为它不能处理所有的在一起,但如果你停止排队更多的请求,系统不会崩溃,然后你会看到所有的他们得到他们的机会,他们再次活跃。
这是IO requests
排队等待处理的典型用例,除非系统崩溃,否则它们都不会丢失,这在现在并不经常发生,由于其实现的鲁棒性,记住蓝屏死机,这仍然可能发生,这是IO请求丢失的唯一点。
事实上,Windows中线程的本质是在并发之前引入健壮性,这样就不会丢失排队等待处理的东西。在任何时候,它都不会超过创建线程数量的限制