当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

2024-03-27

我刚刚观看了以下视频:Node.js 简介 http://www.yuiblog.com/blog/2010/05/20/video-dahl/并且仍然不明白如何获得速度优势。

主要是,Ryan Dahl(Node.js 的创建者)曾经说过,Node.js 是基于事件循环的,而不是基于线程的。线程是昂贵的,只能留给并发编程专家来使用。

随后,他展示了 Node.js 的架构堆栈,该堆栈具有底层 C 实现,内部有自己的线程池。显然,Node.js 开发人员永远不会启动自己的线程或直接使用线程池……他们使用异步回调。我就明白这么多了。

我不明白的是,Node.js 仍然在使用线程……它只是隐藏了实现,那么如果 50 个人请求 50 个文件(当前不在内存中),那么这不是需要 50 个线程吗? ?

唯一的区别是,由于它是内部管理的,Node.js 开发人员不必编写线程细节,但在底层它仍然使用线程来处理 IO(阻塞)文件请求。

那么,您是否真的只是解决一个问题(线程)并将其隐藏起来,而该问题仍然存在:主要是多线程、上下文切换、死锁...等?

这里一定有一些细节我仍然不明白。


实际上,这里混淆了一些不同的事情。但它始于这样一个模因:线程真的很难。因此,如果它们很难,那么在使用线程时,您更有可能 1) 由于错误而中断,2) 不会尽可能有效地使用它们。 (2) 是您要问的问题。

想想他给出的一个例子,其中一个请求进来,你运行一些查询,然后对结果执行一些操作。如果您以标准过程方式编写它,代码可能如下所示:

result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );

如果传入的请求导致您创建一个运行上述代码的新线程,那么您将有一个线程坐在那里,同时什么也不做query()在跑。 (根据 Ryan 的说法,Apache 使用单个线程来满足原始请求,而 nginx 在他所讨论的情况下表现优于它,因为事实并非如此。)

现在,如果您真的很聪明,您可以用一种环境可以在运行查询时关闭并执行其他操作的方式来表达上面的代码:

query( statement: "select smurfs from some_mushroom", callback: go_do_something_with_result() );

这基本上就是 Node.js 正在做的事情。您基本上是在以一种方便的方式装饰您的代码,因为语言和环境,因此关于闭包的要点,环境可以聪明地了解运行的内容和时间。这样一来,node.js 就不是new从某种意义上说,它发明了异步 I/O(并不是任何人都声称有这样的东西),但它的新颖之处在于它的表达方式有点不同。

注意:当我说环境可以聪明地了解运行内容和运行时间时,我的具体意思是,用于启动某些 I/O 的线程现在可以用于处理其他一些请求,或者可以完成一些计算并行,或启动一些其他并行 I/O。 (我不确定节点是否足够复杂以针对同一请求启动更多工作,但您明白了。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Node.js 内部仍然依赖于线程时,它如何本质上更快? 的相关文章

随机推荐

  • 分布式 Tensorflow:检查失败:大小>=0

    我正在使用 keras 2 0 6 Tensorflow的版本是1 3 0 我的代码可以在 theano 后端运行 但在张量流后端运行失败 F tensorflow core framework tensor shape cc 241 检查
  • 使用react-testing-library时无法找到带有文本的元素:“myText”错误

    我正在尝试使用react testing library使用 React 和 Jest 但我的一个测试失败了 我认为这与 regex 上的正则表达式有关className prop在测试文件上 下面我附上了各自的测试和组件文件 另外 有没有
  • 如何更改后退按钮上的文本

    默认情况下 后退按钮使用视图控制器的标题作为其上的文本 我可以在不更改视图控制器标题的情况下更改后退按钮上的文本吗 我需要这个 因为我有一个视图控制器 其标题太长而无法显示 在这种情况下 我想仅显示 后退 作为后退按钮的标题 我尝试了以下方
  • Graphite:用一个命令处理多个系列

    我想将两个系列放在石墨上的同一张图中仪表板 但是 由于仪表板需要单行命令 我找不到不涉及使用通配符的方法 这是我想要在同一张图中显示的两个系列的示例 sum base foo bar positive sum base foo bar ne
  • 自定义选择菜单对话框上的 jquery mobile 关闭按钮

    我正在尝试将 jqm 对话框上的关闭按钮更改为 X 以外的其他按钮 我不能为此使用 CSS 因为我不希望每次都应用它 所以我正在寻找一种使用 jquery 来实现此操作的方法 有问题的对话框是选择菜单 http api jquerymobi
  • @BeforeClass 注释:Junit 与 TestNG

    Why the BeforeClass中的方法JUnit is static而在TestNG its non static TestNG是作为改进而开发的JUnit 那么他们为什么选择这种实现方式呢 Since BeforeClass只运行
  • 检查查询字符串是否为 int 的最佳方法?

    我的一位同事想到的一个问题是 检查查询字符串是否为 int 的最佳方法是什么 我建议使用经典的 Int Parse 和 try and catch 还建议使用 TryParse 其实我也想不出其他的办法了 有任何想法吗 Int32 TryP
  • 使用 jQuery 编写 OO Javascript

    我来自 Prototype JS 背景 通过使用 OO Javascript 被鼓励Class create 现在我正在做一些 JQuery 工作 并且尝试编写一些结构正确的 JQuery 代码 例如 我可以从两个不同的单击事件处理程序调用
  • MySQL SUM 函数

    我了解 SQL sum 函数 这是我的代码
  • 无法对文档执行 querySelectorAll。怎么修?

    我在做什么 我有从 PHP 数组生成的链接 该数组生成它自己的唯一 ID 该 ID 应该指向它自己的模态 弹出窗口 div 该 div 具有与链接 ID 匹配的 ID 模态框也是使用 PHP 数组自动生成的 我收到这个错误 我对此非常陌生
  • REPLACE INTO 查询是好的做法吗?

    我需要一个 SQL 查询来更新或创建数据库条目 如果某个客户尚不存在 我在网上找到了目前的解决方案 command CommandText REPLACE INTO Resource Tracer dbo Customer Customer
  • 如何登录 OpenEdge Progress?

    我找到了在 Progress 4GL 中记录某些内容的不同方法 但没有一个令人满意 简单的MESSAGE语句的缺点是它对帧的处理非常糟糕 ON CHOOSE OF btn Q4 DO MESSAGE Line 1 MESSAGE Line
  • struts2 中的 JQuery Grid - 初学者

    我对 struts2 和 JQuery 编程很陌生 在我的应用程序中 当调用 loginAction 时 如果用户是管理员 我会将他们定向到 AdminLoadAction 此操作加载 adminHome jsp 我需要的是 adminHo
  • 有没有办法将--compressed传递到PHP的curl_setopt()中?

    使用curl时 我发现我所访问的服务器上的行为有所不同 具体取决于我是否通过 compressed作为一个论点或不 我已经将 Accept Encoding 标头设置为 gzip deflate sdch curl setopt ch CU
  • 使用 NSPredicate 搜索 NSFetchedResultsController

    我已经被这个问题困扰了一段时间 并已尽力找出解决方案 我正在使用 Core Data 而且对于 iOS 编码来说相对较新 我在如何搜索 fetchedResultsController 以过滤掉用户在 searchBar 中输入的字符串时遇
  • kubernetes 中的 PreStop 钩子永远不会被执行

    我正在尝试创建一个小 Pod 示例 其中包含两个通过 emptyDir 卷共享数据的容器 在第一个容器中 我等待了几秒钟 然后它就被销毁了 在 postStart 中 我正在将一个名为 started 的文件写入共享卷 在 preStop
  • 即使有请求,为什么 gcc 也不抱怨数组边界?

    我正在使用 gcc 4 9 0 我希望看到编译器警告我超出数组范围 如果我编译这个 int main int table 5 0 table 8 1234 int x table 10 使用 g O2 Wall main cpp o mai
  • 如何使用 jQuery 将行追加到表中?

    您好 我尝试使用 jQuery 在表中添加一行 但它不起作用 可能是什么原因 而且 我可以为新添加的行添加一些值吗 这是代码
  • 地理数据网络服务

    我正在考虑编写一个程序来检查英国议会议员最近提出的一些里程声明 实际上大约有 45 000 个里程 我所掌握的数据相当准确 旅行的出发地和目的地通常仅 在城镇级别提供 我想做的基本上是查看他们提交的里程数据 查看从网络服务获得的 计算 里程
  • 当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

    我刚刚观看了以下视频 Node js 简介 http www yuiblog com blog 2010 05 20 video dahl 并且仍然不明白如何获得速度优势 主要是 Ryan Dahl Node js 的创建者 曾经说过 No