17

我已经阅读了有关 node.js 和其他服务器(例如 Apache)的信息,其中线程不同。我根本不明白线程是什么意思。

如果我有一个运行 SQL 来访问数据库的网页,比如说一个服务器端页面中的三个不同的数据库,这对于 node.js 中的线程意味着什么?阿帕奇?这里的“线程”是什么意思?

或者作为我看到的一篇文章,“启动一个新线程来处理每个请求”。

说 Apache 为每个请求生成一个线程,但 node.js 没有,这是什么意思?

编辑:我希望有一个我能掌握的例子。我习惯于有一个访问数据库的服务器端页面。该文件中有几个连接。

4

3 回答 3

66

线程是程序执行的上下文。单线程程序一次只能做一件事,而多线程程序一次可以做很多事情。

把它想象成餐厅的厨房。一个厨师一次只能做一项任务,比如切洋葱或把东西放进烤箱。如果收到需要厨师大量工作的订单(例如制作沙拉与将东西放入烤箱并等待),则某些餐点可能会因为厨师忙而延迟。另一方面,如果那个厨师只是要烤一堆东西,他没有太多的工作要做,他可以在等待烤箱里的食物完成的同时做其他饭菜。

如果有多名厨师,其中许多任务可以同时完成。可以同时准备许多餐点。

Apache 的线程模型就像雇佣固定数量的厨师(不管你的餐厅当晚有多少顾客),每个厨师一次只能做一顿饭。这意味着,如果有一份餐单,则会为该餐分配一名专门的厨师。厨师有时会忙着切配料和混合蛋糕面糊,但有时他只是站着等土豆煮沸。在任何给定时间,您的大多数厨师都可以闲着,等待煮土豆和烤蛋糕,并且不会再处理任何订单,因为每个厨师一次只专注于一个订单。

更糟糕的是,你的厨房只有你能负担得起的那么大。每个厨师都占用空间和资源,您可能会遇到这样一种情况,一群厨师拿着唯一可用的勺子站在周围,阻止其他厨师制作他们的食物。

Nginx 是您没有询问的另一个 Web 服务器(通常用作代理),但我将它包括在内是为了解释另一个线程模型。它还雇用固定数量的厨师,但雇用的厨师人数较少。每个厨师一次可以处理多餐。因此,如果他们在等待土豆煮熟时收到一份切碎的沙拉订单,他们可以继续做沙拉,而不是无所事事。您可以拥有一个较小的厨房(相对于餐厅的大小/顾客数量),并获得相同数量或更多的餐点。这是一个紧凑的工作人员,可以有效地不浪费时间和资源。

Node.js 有点不同。从 JavaScript 的角度来看,它是单线程的,但磁盘和网络 IO 等其他任务是在单独的线程上自动处理的。这就像拥有一个只有一名厨师的厨房,但在某些情况下这是有道理的。如果您的厨房有很多忙于该厨师的工作,那么雇用更多厨师来工作也许是有意义的。(要在 Node.js 中执行此操作,您只能生成更多进程,这实际上就像在彼此相邻的地方建造一堆小厨房。您可以让一个人站在前面协调所有这些厨房的订单。)但是,如果你只是一家面包店(主要是 IO,厨师的工作很少),也许你只需要一个厨师。

综上所述,不同的线程模型用于划分工作并有效地处理它。哪种线程模型有意义取决于您的需求以及您选择的服务器的其他特性。

于 2013-10-11T18:13:17.097 回答
1

Node.js 是单线程的,它一次只能做一件事。不过,您几乎可以在所有云服务提供商上运行节点进程的多个实例。apache 进程可以在线程上执行多任务。

如果节点进程由于某种原因挂起,则不会发生其他任何事情。这就是为什么以异步方式编写节点很重要,这样如果数据库查询挂起,节点仍然可以接受请求。

无需太技术化,线程可以被认为是程序高速公路上的一条车道。它是一个特定的执行渠道。在请求的生命周期中,必须发生很多事情。所有这些东西都在一个盒子里。

节点没有线程!你可以把它想象成一条单车道。但是部署节点的方式,您会获得该单车道道路的许多实例。虽然他们不分享任何东西。如果您将一个值添加到一个数组中,则它不在另一个数组中。任何需要共享的东西都必须在缓存或数据库层中共享。

于 2013-10-11T17:58:06.940 回答
1

人们混淆的是线程、进程和异步、非阻塞 I/O。

线程是进程的子级“可运行”。所有的执行环境都是为一个线程设置的。从堆栈到可寻址内存位置,它被分配给一个线程。如果子级线程必须与主进程线程通信,则必须使用安全消息传递、通知模型。根据语言,有多种方法可以做到这一点。

Node.js 是单线程的,显然是基于单进程的。它不适用于高 CPU 密集型阻塞调用。但是如果你仍然想使用,你可以考虑节点集群。因此,它不是创建线程,而是创建多个像线程一样工作的“进程”。

异步 - 所有带有回调函数的代码实际上都不是异步的。好吧,换句话说,从字面上看,它们是异步的,因为它们不会阻止呼叫。

但是在 Node.js 上下文中,当有人说 Node 是异步的时,它完全与操作系统接口相关联。Node 的能力取决于底层操作系统的非阻塞 I/O 能力。因此,无论操作系统支持非阻塞 I/O 的任何对象,例如套接字、文件、管道、节点,它们都会最大限度地利用它们。

顺便说一句,当您谈论 Apache 时,理想情况下您应该比较 Nginx。不是 Node.js。Node.js 并不打算用作 Web 服务器。它基本上是一个有效利用异步 I/O 的进程。

于 2020-05-27T14:22:57.443 回答