gpt4 book ai didi

javascript - Node.js 在处理大文件上传时会被阻塞吗?

转载 作者:IT老高 更新时间:2023-10-28 23:15:23 28 4
gpt4 key购买 nike

Node.js 在处理大文件上传时会被阻塞吗?

由于 Node.js 只有一个线程,是不是在上传大文件时所有其他请求都会被阻塞?

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

最佳答案

所有 I/O 操作都由 Node.js 处理,内部使用多个线程;它是单线程、基于事件和异步的 I/O 功能的编程接口(interface)。

因此,您的示例的大上传是由 Node.js 管理的单独线程执行的,当该线程完成其工作时,您的回调将被放入事件循环队列中。

当您执行 CPU 密集型任务时,它会阻塞。假设我们有一个任务 compute() 需要几乎连续运行,并进行一些 CPU 密集型计算。


回答主要问题“ 我应该如何处理 nodejs 中的文件上传?
检查您在服务器上保存文件的代码(或库),它是否依赖于 writefile() or writeFileSync()?
如果是使用 writefile()然后是异步的;但是如果是 writeFileSync()它是同步版本。


更新:回应评论:

"the answer "No, it won't block" is correct but explanation is completely wrong. JS is in one thread AND I/O is in one (same) thread. Event loop / asynchronous processing / callbacks make this possible. No multiple threads required. " - by andrey-sidorov

没有用于文件操作的异步 API,因此 Node.js 使用线程池。可以在libuv的代码中看到.您可以在 lib/fs.js 中查看 fs.readFile 的源代码。 ,你会看到 binding.read。每当您在 Node 的核心模块中看到绑定(bind)时,您就是在寻找进入 C++ 领域的门户。使用 NODE_SET_METHOD(target, "read", Read) 可以使用此绑定(bind)。如果你知道任何 C 语言,你可能会认为这是一个宏——它最初是,但现在它是一个函数。

回到Read中的ASYNC_CALL,其中一个参数是read:系统调用读取。但是等等,这个功能不会阻塞吗?

是的,但这不是故事的结局。一个 Introduction to libuv表示如下:

"libuv文件系统操作不同于socket操作。socket操作使用操作系统提供的非阻塞操作。文件系统操作在内部使用阻塞函数,但是在线程池中调用这些函数并且当需要应用交互时通知注册到事件循环的观察者。"

总结: Node API 方法 writeFile()是异步的,但这并不一定意味着它在下面是非阻塞的。作为 libuv book指出,套接字(网络)代码是非阻塞的,但文件系统更复杂。有些事情是基于事件的(kqueue),有些事情使用线程池(如本例)。

考虑通过C code on which Node.js is developed ,了解更多信息:

关于javascript - Node.js 在处理大文件上传时会被阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22981624/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com