当前位置: 首页 > 知识库问答 >
问题:

线程池的完成端口线程在异步I/O中的行为如何。NET/.NET核心

叶光华
2023-03-14

的。NET/.NET Core线程池在内部使用两种不同类别的线程:工作线程和I/O完成端口(IOCP)线程。两者都只是通常的托管线程,但用于不同的目的。通过不同的API(例如任务。启动线程池。QueueUserWorkItem)我可以在工作线程上启动CPU绑定的异步操作(不应该阻止,否则线程池可能会创建额外的工作线程)。

但是执行I/O绑定的异步操作呢?IOCP线程在这些情况下是如何工作的?具体而言,我有以下问题:

  • 如果启动异步I/O操作(例如,对于文件、管道或网络),我怀疑当前线程调度异步请求。我还知道(通过“CLR via C#”一书),CLR注册到用于执行重叠异步I/O的I/O完成端口。我怀疑此IOCP绑定到异步操作,以便稍后可以将异步操作结果排队到线程池。因此,当异步请求启动时,没有触及IOCP线程的假设正确吗
  • 我怀疑当异步I/O操作的结果通过CLR的I/O完成端口报告时,这就是IOCP线程的位置。结果将排队到线程池,并使用IOCP线程来处理它。然而,当阅读MSDN上的一些论坛线程时,我感觉IOCP线程实际上被用来发送请求,然后阻塞,直到返回结果。是这样吗?当I/O操作由对方系统处理时,IOCP线程是否阻塞
  • 那么异步等待同步上下文呢?IOCP线程是否处理异步I/O响应,然后(例如)在UI线程上排队继续(假设未调用ConfigureAwait(false)
  • 那怎么办。Linux/MacOS X上的NET内核?没有I/O完成端口-是否以任何方式模拟它们

共有1个答案

闻人弘雅
2023-03-14

达米恩和汉斯在评论中为我指出了正确的方向,我想在这个回答中总结一下。

达米恩指出斯蒂芬·克利里的精彩博客文章回答了前三点:

  • 异步I/O操作在调用线程上调度。没有涉及IOCP线程

Hans指出,Linux(epoll)和MacOS(kqueue)中有类似于IOCP的机制

 类似资料:
  • 本文向大家介绍C#线程处理系列之线程池中的I/O线程,包括了C#线程处理系列之线程池中的I/O线程的使用技巧和注意事项,需要的朋友参考一下 一、I/O线程实现对文件的异步  1.1  I/O线程介绍: 对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程。 工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程

  • 根据该条:https://quarkus.io/blog/resteasy-reactive-smart-dispatch/我应该能够通过使用“just”注释方法来使用I/O线程。 当使用最新的夸克快速入门并修改入门示例时: 我希望为方法获得一个I/O线程。然而,结果是: 因此,在这两种情况下(根据vert.x-worker-thread),都是一个工作线程,而不是I/O线程。 QUUKUS版本是

  • 问题内容: 使用winsock,可以将套接字配置或将单独的I / O操作配置为“重叠”。这意味着将立即返回执行I / O的调用,而实际的操作则由单独的工作线程异步完成。 Winsock还提供“完成端口”。据我了解,完成端口充当句柄(套接字)的多路复用器。如果一个句柄不在I / O操作的中间,即它的所有I / O操作都已 完成 ,则可以对其进行多路分解。 那么,关于我的问题… Linux是否支持完成

  • 我正在使用来处理通过文件的大量记录。每一行都是一条记录,我将每一行传递给单独的线程进行处理,问题是我必须收集这些处理过的记录以及在处理记录时生成的更多数据,然后在最后的数据收集上应用一些业务逻辑。我将一个通用的传递给所有线程来填充已处理的数据,当我通过visualVM调试它时,我发现(屏幕截图如下)这些线程在等待中花费的时间比在运行中花费的时间多。我想这是因为一个线程在写入时获得了锁。 有没有一种

  • 问题内容: 我有一个使用该框架的Java应用程序,并且我的代码看起来像这样 我的理解是,JVM会在内部创建5个线程的池。现在,当我在探查器中检查执行情况时,会得到类似的信息。 , 我需要一种方法来区分由我创建的和由服务器创建的 。 我在想,如果我可以命名线程池,它应该可以解决问题,但是看不到任何允许我执行此操作的API。 提前致谢。 问题答案: 您可以将自己的ThreadFactory传递给Sch

  • 支持Python异步。包括对Core和ORM使用的支持,使用了异步兼容的方言。 1.4 新版功能. 注解 从SQLAlChemy 1.4.3开始的异步扩展现在可以被认为是 测试级 软件。API细节可能会更改,但是在这一点上,不太可能有重大的向后不兼容更改。 参见 对内核和ORM的异步IO支持 -初始功能发布 异步集成 -示例脚本演示了asyncio扩展中核心和ORM使用的工作示例。 Asyncio