如果有阻塞操作,线程会执行什么 I/O 回调?

问题描述

  • Node js 在底层使用 libuv 为其提供事件循环功能
  • 事件循环具有特定的阶段顺序。正如 Node docs 中定义的那样,poll 阶段负责轮询 I/O。它预先假定等待来自操作系统的通知并执行以下运行所需的回调(就我而言)。
  • 据说所有事件循环代码都在主线程中执行(而且 I/O 回调似乎也应该如此)。
  • libuv一个线程池,用于无法以异步、非阻塞方式完成的操作。

我的问题是当线程池中的一个线程完成阻塞操作时会发生什么?然后哪个线程执行例如 I/O 操作的回调?

Colin Ihrig 展示了节点 copyFile 操作的一些复杂性。它的异步版本是使用线程池 (timecode) 中的一个线程执行的。它使用 uv__fs_done 函数进行调度,一旦操作完成,就必须调用函数(参见视频)。看来这个函数调用the callback(不幸的是,我无法彻底理解 C 代码)。

这是否意味着 libuv 线程池中的一个线程实际上执行了 I/O 回调而不是主线程作为事件循环的一部分?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)