一尘不染

处理大文件上传时,Node.js是否会被阻止?

node.js

处理大文件上传时,Node.js是否会被阻止?

由于Node.js仅具有一个线程,是真的,当上传大文件时,所有其他请求都将被阻止吗?

如果是这样,我应该如何处理Node.js中的文件上传?


阅读 305

收藏
2020-07-07

共1个答案

一尘不染

所有的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_CALLRead,其中一个参数是read系统调用读 。但是,等等,这个功能块不是吗?

是的
,但这还不是故事的结局。一个介绍libuv表示如下:

libuv文件系统操作与套接字操作不同。套接字操作使用操作系统提供的非阻塞操作。文件系统操作在内部使用阻塞功能,
但在线程池中调用这些功能,并在应用程序时通知已向事件循环注册的观察者需要互动。

简介: Node
API方法writeFile()是异步的,但这并不一定意味着它在下面是非阻塞的。正如libuv
书中指出的那样,套接字(网络)代码是非阻塞的,但是文件系统更为复杂。有些东西是基于事件的(kqueue),有些则使用线程池(在这种情况下)。

考虑了解开发Node.js的C代码,以获取更多信息:

2020-07-07