libuv在内部使用阻塞文件系统调用 - 为什么?怎么样?

Rob*_*mer 5 asynchronous nonblocking node.js libuv

我刚刚了解到Node.js皇冠宝石libuv使用阻塞系统调用进行文件操作.异步行为是通过线程实现的!这提出了两个问题(我关心Unix):

  1. 为什么它不像网络那样使用非阻塞文件系统调用?
  2. 如果有一百万个未完成的文件读取,它可能不会启动一百万个线程...... libuv做了什么?

Jon*_*ski 5

  1. 最有可能支持同步操作,比如fs.renameSync()VS fs.rename().

  2. 它使用线程池,如您提供的链接中的" 注释 "中所述.

    [...]但是在线程池中调用这些函数,并在需要应用程序交互时通知在事件循环中注册的观察者.

    因此,它创建了有限数量的线程,并在它们可用时重用它们.

此外,关于" 皇冠宝石:"Node.js和libuv的讽刺不是魔术.它们是您可以随意使用的好工具,但肯定有它们的局限性.

尽管如此," 百万文件读取 " 的夸张可能是任何平台无限制地管理的延伸.


Rob*_*mer 3

    \n
  1. 不能使用相同非阻塞 API,因为 O_NONBLOCK 和朋友不处理常规文件!对于Linux,AIO 是可用的,但它有\xe2\x80\x99 自己的怪癖(即取决于文件系统,对某些操作会默默地阻塞)。

  2. \n
  3. 我不知道。

  4. \n
\n