Multithreading Nodejs中的单线程是什么意思

Multithreading Nodejs中的单线程是什么意思,multithreading,node.js,callback,Multithreading,Node.js,Callback,我经常听到节点只在一个线程中运行。然而,我不明白的是,node如何只使用一个线程就可以实现非阻塞。假设有100个并发请求到达一个节点web服务器,服务器生成100个回调来处理这些请求。如果100次回调中的每一次都需要1秒才能完成,并且如果所有回调都在一个线程中,那么它们必须以串行方式完成,这是否意味着它将被阻塞100秒?来自博客 当前编程技术最大的浪费来自等待I/O完成。有几种方法可以处理性能影响(来自Sam): 同步:一次处理一个请求,每个请求依次处理。优点:简单的缺点:任何一个请求都可能阻

我经常听到节点只在一个线程中运行。然而,我不明白的是,node如何只使用一个线程就可以实现非阻塞。假设有100个并发请求到达一个节点web服务器,服务器生成100个回调来处理这些请求。如果100次回调中的每一次都需要1秒才能完成,并且如果所有回调都在一个线程中,那么它们必须以串行方式完成,这是否意味着它将被阻塞100秒?

来自博客

当前编程技术最大的浪费来自等待I/O完成。有几种方法可以处理性能影响(来自Sam):

  • 同步:一次处理一个请求,每个请求依次处理。优点:简单的缺点:任何一个请求都可能阻塞所有其他请求
  • 分叉一个新流程:启动一个新流程来处理每个请求。优点:简单的缺点:不能很好地扩展,数百个连接意味着数百个进程。fork()是Unix程序员的锤子。因为它是可用的,所以每个问题看起来都像钉子。这通常是过分的

  • 线程:启动一个新线程来处理每个请求。优点:比使用fork更简单,对内核也更友好,因为线程的开销通常要小得多。缺点:您的机器可能没有线程,线程编程可能会变得非常复杂,速度非常快,并且担心控制对共享资源的访问

Node.js为您的代码保留一个线程…

它实际上是一个单线程运行:您不能执行任何并行代码;例如,执行“睡眠”将阻塞服务器一秒钟:

while(new Date().getTime() < now + 1000) {
   // do nothing
}
while(新日期().getTime()
因此,当代码运行时,node.js不会响应来自客户端的任何其他请求,因为它只有一个线程来执行代码。或者,如果您有一些CPU密集型代码,例如,用于调整图像大小的代码,那么仍然会阻止所有其他请求


Node.js不是单线程的。这是一种误导性的说法。只有js引擎在一个线程上运行。但是,其他地方有一个线程池。看看这个谢谢@om_deshpande。这对我来说很有意义。因此,实际上回调并不在与主线程相同的线程中运行。这个解释完全有道理。没错!正确描述node.js的概念是“事件循环”和“异步”而不是“单线程”。这些评论有点误导。包括所有npm库的nodejs程序将在一个线程中运行。因此,它被称为单线程。但是V8引擎和所有IO在单独的线程中运行(简化)。非常好的文章,感谢分享@Damodaran。通过阅读本文,我感觉回调运行在不同于主线程的线程中。让我们把这个问题说得非常清楚,如果我们有一个回调做db查询,另一个回调做文件访问,现在的问题是:主循环/线程和db查询回调,以及地球上的文件访问回调是否在同一个线程中运行?@ivoszz,如果它们在同一个线程中,它们将被串联执行。这句话对吗?如果这句话是正确的,他们怎么能不互相阻碍呢?谢谢。@ElgsQianChen参考此感谢@Damodaran,现在的问题似乎是我对“线程”概念的理解。我从Java学习了“线程”的概念。我的理解是线程中的任务必须以串行方式执行。我最初的问题取决于我对“线程”概念的理解。如果我对“线程”的理解是正确的,那么我仍然不相信回调与主线程运行在同一个线程中。然而,如果我对“线程”的理解是错误的,我应该保留我的问题,回去做更多的研究。这个概念有一个很大的优势。您的代码不能被中断。这意味着您不必担心库中的并发性。