我刚刚了解到 Node.js 皇冠上的宝石libuv使用阻塞系统调用进行文件操作。异步行为是用线程实现的!这提出了两个问题(我只关心 Unix):
- 为什么它不像网络那样使用非阻塞文件系统调用?
- 如果有一百万个未完成的文件读取,它可能不会启动一百万个线程...... libuv 是做什么的?
我刚刚了解到 Node.js 皇冠上的宝石libuv使用阻塞系统调用进行文件操作。异步行为是用线程实现的!这提出了两个问题(我只关心 Unix):
最有可能支持同步操作,例如fs.renameSync()
vs fs.rename()
。
它使用线程池,如您提供的链接中的“注释”中所述。
[...] 但在线程池中调用这些函数并在需要应用程序交互时通知注册到事件循环的观察者。
因此,它创建了有限数量的线程,并在它们可用时重用它们。
此外,关于“皇冠上的明珠”的俏皮话:Node.js 和 libuv 并不神奇。它们是供您使用的好工具,但肯定有其局限性。
尽管如此,“一百万次文件读取”的夸张对于任何平台来说都无法无限制地进行管理。
不能使用相同的非阻塞 API,因为 O_NONBLOCK 和朋友不处理常规文件!对于 Linux AIO 是可用的,但它有自己的怪癖(即取决于文件系统,对于某些操作会静默阻塞)。
我不知道。