【问题标题】:How does Node.js handle simultaneous requests with one thread?Node.js 如何用一个线程处理并发请求?
【发布时间】:2015-03-24 05:53:49
【问题描述】:

我对这个问题进行了一些搜索,但似乎人们只强调非阻塞 IO。

假设我只有一个非常简单的应用程序来向客户端响应“Hello World”文本,它仍然需要时间来完成执行,不管它有多快。如果同时有两个请求进来怎么办,Node.js如何确保两个请求都用一个线程处理?

我阅读了博客Understanding the node.js event loop,上面写着“当然,在后端,有用于数据库访问和进程执行的线程和进程”。该声明是关于 IO 的,但我也想知道是否有单独的线程来处理请求队列。如果是这样的话,我能说 Node.js 单线程的概念只适用于在 Node.js 上构建应用的开发者,而 Node.js 实际上是在后台运行在多线程上的吗?

【问题讨论】:

  • 请注意“在 node.js 中,除了你的代码之外,所有东西都是并行运行的”。您的代码在单线程中运行,但事件由幕后的多个线程处理。
  • @BibekSubedi,我 google In node.js, everything runs in parallel except your code,它有助于澄清一些困惑,谢谢。

标签: javascript node.js multithreading


【解决方案1】:

操作系统给每个套接字连接一个发送和接收队列。这就是字节所在的位置,直到应用层的某些东西处理它们。如果接收队列已满,则在队列中有可用空间之前,没有连接的客户端可以发送信息。这就是为什么应用程序应该尽可能快地处理请求。

如果您在 *nix 系统上,您可以使用 netstat 查看发送和接收队列中的当前字节数。在本例中,接收队列中有 0 个字节,发送队列中有 240 个字节(等待操作系统发送出去)。

Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      240 x.x.x.x:22                 x.x.x.x:*                   LISTEN

在 Linux 上,您可以使用 proc 文件系统检查发送/接收队列的默认大小和最大允许大小:

Receive:

cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max

Send:

cat /proc/sys/net/core/wmem_max
cat /proc/sys/net/core/wmem_default

【讨论】:

  • 所以你说 Node.js 依赖操作系统来排队请求,它没有自己的实现来处理队列,对吗?
  • 是的,Node.js 没有什么神奇之处,就像所有其他应用程序一样,它依赖于操作系统来处理网络层。
  • 我还是一头雾水。我刚刚从 Node 的 about 页面中阅读了 This is in contrast to today's more common concurrency model where OS threads are employed。似乎 Nodejs 没有使用 OS 线程,不确定我是否理解正确。
  • 他们在那里谈论单线程与单线程连接。
  • 如果您担心多个请求同时进入,那么您正在向下移动到网络层。让操作系统担心这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2018-08-24
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多