所有的I / O操作都由Node.js处理,内部使用多个线程。I / O功能的编程接口是单线程,基于事件和异步的。
因此,示例的大量上传工作由Node.js管理的单独线程执行,当该线程完成工作时,您的回调将放入事件循环队列中。
当您执行CPU密集型任务时,它将阻塞。假设我们有一个任务compute(),它几乎需要连续运行,并进行一些CPU密集型计算。
回答主要问题“ 我应该如何在nodejs中处理文件上载? ”
检入代码(或库),将文件保存在服务器上,该文件依赖于
writefile()还是
writeFileSync()?
如果使用的是
writefile()异步的;但是如果它
writeFileSync()是同步版本。
更新: 针对评论:
“答案为“不会,它不会阻塞”是正确的,但说明是完全错误的。JS在一个线程中,I /
O在一个(相同)线程中。事件循环/异步处理/回调使这成为可能。所需的线程。”-作者:andrey-
sidorov
没有用于文件操作的异步API,因此Node.js为此使用了线程池。您可以在libuv的代码中看到它。您可以在lib
/
fs.js中查看fs.readFile的源代码,您将看到binding.read。每当您在Node的核心模块中看到绑定时,您就在看C
++领域的门户。使用NODE_SET_METHOD(target,“
read”,Read)可以使用此绑定。如果您知道任何C,您可能会认为这是一个宏–最初是宏,但现在是函数。
让我们再回到
ASYNC_CALL中
Read,其中一个参数是
read: 系统调用读 。但是,等等,这个功能块不是吗?
是的
,但这还不是故事的结局。一个介绍libuv表示如下:
“ libuv文件系统操作与套接字操作不同。套接字操作使用操作系统提供的非阻塞操作。文件系统操作在内部使用阻塞功能,
但在线程池中调用这些功能,并在应用程序时通知已向事件循环注册的观察者需要互动。 ”
简介: Node
API方法
writeFile()是异步的,但这并不一定意味着它在下面是非阻塞的。正如libuv
书中指出的那样,套接字(网络)代码是非阻塞的,但是文件系统更为复杂。有些东西是基于事件的(kqueue),有些则使用线程池(在这种情况下)。
考虑了解开发Node.js的C代码,以获取更多信息:
- Unix fs.c
- Windows fs.c



