栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

处理大文件上传时,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_CALL
Read
,其中一个参数是
read
系统调用读 。但是,等等,这个功能块不是吗?

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

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

简介: Node
API方法

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

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

  • Unix fs.c
  • Windows fs.c


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367984.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号