我想知道当没有IO线程来处理异步调用的结果时会发生什么。
假设您发出异步Web请求(在服务器应用程序中,因此所有异步代码都由线程池管理)。 OS会在有结果时发出信号,当它出现时,你需要一个IO线程来读取套接字中的字节。如果没有可用的IO线程,因为它们都在使用(所有意味着最多由线程池设置的最大值)会发生什么?是否有一个队列,信号可以等到有线程可用?或者信号是否闻所未闻?如果后者发生,等待等待的代码会发生什么?
答案 0 :(得分:5)
除非您限制了线程池,否则它将根据需要创建新的I / O线程。信号在称为I/O Completion Port (IOCP)的队列式结构中等待,直到它被检索为止;信号不会丢失。
答案 1 :(得分:2)
让我们回到更早的时候,当OS
使用初步而且concurrency
的范围不大时,那么如果你打开了多个需要IO
的应用程序像Excel, Word, Pdf, Ppt
一样,系统似乎挂起并且没有响应,因为它不能同时处理所有这些,但是如果你停止排队更多的请求,并且系统没有崩溃,那么你会看到所有他们得到了机会,他们再次活跃起来。
这是IO requests
排队等待处理的典型用例,除非系统崩溃,否则它们都不会丢失,而现在通常不会发生这种情况,因为它的实现,请记住死亡的蓝屏,这仍然可能发生,这是IO请求丢失的唯一一点。
事实上,Windows中的线程的本质是即使在并发之前引入健壮性,因此排队等待处理的任何内容都将丢失。在任何时候它都不会超过其限制以创建超过所需数量的线程