我刚刚了解到 Node.js 皇冠上的明珠 libuv uses blocking system calls for file operations .异步行为是用线程实现的!这就提出了两个问题(我只关心 Unix):
- 为什么它不像网络那样使用非阻塞文件系统调用?
- 如果有 100 万个未完成的文件读取,它可能不会启动 100 万个线程...libuv 是做什么的??
最佳答案
最有可能支持同步操作,例如
fs.renameSync()
对比fs.rename()
.它使用线程池,如您提供的链接中的“注意”中所述。
[...] 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/