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

时间:2013-11-17 14:51:34

标签: node.js asynchronous nonblocking libuv

我刚学会了Node.js皇冠宝石libuv uses blocking system calls for file operations。异步行为是通过线程实现的!这提出了两个问题(我关心Unix):

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

2 个答案:

答案 0 :(得分:5)

  1. 最有可能支持fs.renameSync()fs.rename()等同步操作。

  2. 它使用一个线程池,如您提供的链接中的“注意”中所述。

      

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

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

  3. 另外,关于“皇冠宝石的讽刺:”Node.js和libuv并不神奇。它们是您可以随意使用的好工具,但肯定有其局限性。

    尽管如此,“ 100万个文件读取”的夸张可能是任何平台无限制地管理的延伸。

答案 1 :(得分:2)

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

  2. 我不知道。