处理大文件上传时,Node.js是否会被阻止?
由于Node.js仅具有一个线程,是真的,当上传大文件时,所有其他请求都将被阻止吗?
如果是这样,我应该如何处理Node.js中的文件上传?
所有的I / O操作都由Node.js处理,内部使用多个线程。I / O功能的编程接口是单线程,基于事件和异步的。
因此,示例的大量上传工作由Node.js管理的单独线程执行,当该线程完成工作时,您的回调将放入事件循环队列中。
当您执行CPU密集型任务时,它将阻塞。假设我们有一个任务compute(),它几乎需要连续运行,并进行一些CPU密集型计算。
回答主要问题“ 我应该如何在nodejs中处理文件上载? ” 检入代码(或库),将文件保存在服务器上,该文件依赖于writefile()还是 writeFileSync()? 如果使用的是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: 系统调用读 。但是,等等,这个功能块不是吗?
ASYNC_CALL
Read
read
是的 ,但这还不是故事的结局。一个介绍libuv表示如下:
“ libuv文件系统操作与套接字操作不同。套接字操作使用操作系统提供的非阻塞操作。文件系统操作在内部使用阻塞功能, 但在线程池中调用这些功能,并在应用程序时通知已向事件循环注册的观察者需要互动。 ”
简介: Node API方法writeFile()是异步的,但这并不一定意味着它在下面是非阻塞的。正如libuv 书中指出的那样,套接字(网络)代码是非阻塞的,但是文件系统更为复杂。有些东西是基于事件的(kqueue),有些则使用线程池(在这种情况下)。
writeFile()
考虑了解开发Node.js的C代码,以获取更多信息: