首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件驱动和非事件驱动web服务器中的线程。

事件驱动和非事件驱动web服务器中的线程。
EN

Stack Overflow用户
提问于 2013-01-07 03:31:28
回答 2查看 4K关注 0票数 11

下面两个图表是我对线程如何在事件驱动的web服务器(如Node.js + JavaScript)中与非事件驱动的web服务器(如IIS + C#)进行比较的理解。

从图中可以很容易地看出,在传统的web服务器上,用于执行3次长时间运行操作的线程数要比事件驱动的web服务器上的线程数(3对1)大。

我想我得到了“传统的web服务器”计数正确(3),但我想知道事件驱动的一个(1)。以下是我的问题:

  1. 假设在事件驱动的场景中只使用一个线程是正确的吗?这不可能是正确的,必须已经创建了一些东西来处理I/O任务。对吗?
  2. 事件服务器是如何处理I/O的?假设I/O是从数据库中读取的。我怀疑web服务器必须创建一个线程来传递连接到数据库的工作吗?对吗?
  3. 如果事件驱动的web服务器确实创建了线程来处理I/O,那么收益在哪里呢?
  4. 我混淆的一个可能的解释可能是,在传统的和事件驱动的两种情况下,确实创建了三个单独的线程来处理I/O (没有显示在图片中),但区别实际上在于web服务器上的线程数量本身,而不是I/O线程。这准确吗?
EN

回答 2

Stack Overflow用户

发布于 2013-01-07 11:19:58

  1. 节点可以使用线程进行IO。JS代码在一个线程中运行,但所有IO请求都在并行线程中运行。如果您希望在并行线程中运行一些JS代码,请使用线程a-gogo或其他一些可以减轻这种行为的包。
  2. 1.一样,线程由Node为IO操作创建。
  3. 除非你愿意,否则你不需要处理线程。更容易开发。至少这是我的观点。
  4. 节点应用程序可以被编码以像另一个web服务器那样运行。通常,JS代码运行在一个线程中,但是有一些方法可以使它的行为有所不同。

就我个人而言,如果您想尝试使用线程,我建议您使用线程(包名不是很有启发性,但很容易使用)。更快。节点还支持多个进程,如果您也想尝试运行一个完全独立的进程。

票数 6
EN

Stack Overflow用户

发布于 2016-03-29 15:34:22

描述NodeJS的最好方法是像一只愤怒的松鼠(即你的线程)在轮子中运行,有无限数量的鸽子(你的I/O)可以传递消息。

节点中的I/O是“空闲”的。您的松鼠可以设置连接并将鸽子发送出去,然后在鸽子检索数据时继续执行其他操作,只在鸽子返回时处理数据。

如果您编写了错误的代码,您可能会让松鼠等待每只鸽子。

因此,始终编写非阻塞i/o代码。

如果你能鼓励你的鸽子承诺回来;)

承诺和生成器可能是您可以采取的最佳方法。

但是,您可以始终使用Node集群来建立一个主松鼠,它将根据主松鼠可以找到的CPU数量来生成子松鼠。

希望这有帮助,并注意到完全没有汽车类比。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14189496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档