当前位置: 首页 > 面试题库 >

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

公孙阳羽
2023-03-14
问题内容

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

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

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


问题答案:

所有的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代码,以获取更多信息:

  • Unix fs.c
  • Windows fs.c


 类似资料:
  • 我的目标是将一个大文件(任何文件类型)上传到Azure Blob中。 下面是我得到的错误 方法1工作很好,但上传时间太长。(统计数据:上传40 MB文件花了80秒)。 我的第二个方法是正确的一个提高性能?如果是,如何实现此方法? 有没有更好的方法来提高性能?在这方面有什么建议吗? 下面是套接字错误 我在这里错过了什么?为什么在创建块时发生套接字错误?

  • 用Flask处理非常大的文件上传(1 GB+)的最佳方式是什么? 我的应用程序基本上接受多个文件,为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上。 我们如何运行文件上传作为一个后台任务,这样用户就不会有浏览器旋转1小时,而是可以立即进入下一页? null

  • 问题内容: 用Flask处理超大文件上传(1 GB以上)的最佳方法是什么? 我的应用程序实际上需要多个文件,为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上。 我们如何将文件上传作为后台任务运行,以使用户在1小时内没有浏览器旋转,而是可以立即进入下一页? Flask开发服务器能够处理大量文件(50gb需要1.5个小时,上传速度很快,但将文件写入空白文件的速度却很慢) 如果我用T

  • 你想处理一个由用户上传的文件,比如你正在建设一个类似Instagram的网站,你需要存储用户拍摄的照片。这种需求该如何实现呢? 要使表单能够上传文件,首先第一步就是要添加form的enctype属性,enctype属性有如下三种情况: application/x-www-form-urlencoded 表示在发送前编码所有字符(默认) multipart/form-data 不对字符

  • 本文向大家介绍PHP文件上传问题汇总(文件大小检测、大文件上传处理),包括了PHP文件上传问题汇总(文件大小检测、大文件上传处理)的使用技巧和注意事项,需要的朋友参考一下 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置。一方面,用户不希望隐私泄露,所以浏览器无法对用户在上传时选择的文件做有效的判 断。另一方面,为了服务器

  • 问题内容: 我正在考虑将WCF用于一个项目,该项目需要人们能够将大文件(64MB-1GB)上传到我的服务器。我将如何使用WCF处理此问题,可能还具有恢复上传的功能。 为了处理更大的客户群,我想通过WCF测试JSON。这将如何影响文件上传?可以通过JSON完成,还是需要将上传部分切换到REST? 问题答案: 如果要上传大文件,则肯定需要查看WCF流模式。 基本上,您可以更改绑定上的传输模式;默认情况