node.js - libuv 在内部使用阻塞文件系统调用——为什么?如何?

标签 node.js asynchronous nonblocking libuv

我刚刚了解到 Node.js 皇冠上的明珠 libuv uses blocking system calls for file operations .异步行为是用线程实现的!这就提出了两个问题(我关心 Unix):

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

最佳答案

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

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

    [...] but invoke these functions in a thread pool and notify watchers registered with the event loop when application interaction is required.

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

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

不过,“一百万次文件读取”这个夸张的说法对于任何平台来说都难以不受限制地进行管理。

关于node.js - libuv 在内部使用阻塞文件系统调用——为什么?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032078/

相关文章:

c# - 如何在 C# 中创建可重新触发的延迟?

c++ - 异步事件循环设计和问题

javascript - 将 REST 请求中的大数据 JSON 反序列化为对象而不锁定浏览器?

Node.js Express 中间件 : app. 参数与 app.use

node.js - 是否可以基于服务器端数据构建隐藏区域/React-Components?

node.js - 在 Express/Node 中使用 sendFile 时出现随机 'ECONNABORTED' 错误

javascript - Node.js zlib.deflate 输出太长

java - 如何在 Wildfly 11 上的异步事件中保留 CDI 上下文?

javascript:用一个回调执行一堆异步方法

c++ - 使用 fgets 作为非阻塞函数 c++