Multithreading 如果说Apache会为每个请求生成一个线程,而node.js不会,这意味着什么?

Multithreading 如果说Apache会为每个请求生成一个线程,而node.js不会,这意味着什么?,multithreading,node.js,apache,Multithreading,Node.js,Apache,我读过node.js和其他服务器,比如Apache,它们的线程不同。我根本不明白线程是什么意思 如果我有一个运行SQL来访问数据库的网页,比如说一个服务器端页面中有三个不同的数据库,那么这对node.js中的线程处理意味着什么?阿帕奇?这里的“线”是什么意思 或者就像我看到的一篇文章,“启动一个新线程来处理每个请求。” 如果说Apache会为每个请求生成一个线程,而node.js不会,这意味着什么 编辑:我希望有一个我能掌握的例子。我习惯于使用服务器端页面访问数据库。该文件中有多个连接。Node

我读过node.js和其他服务器,比如Apache,它们的线程不同。我根本不明白线程是什么意思

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

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

如果说Apache会为每个请求生成一个线程,而node.js不会,这意味着什么


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

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

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

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


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

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

把它想象成餐馆的厨房。一个厨师一次只能做一件事,就是切碎意见或把东西放进烤箱。如果一份订单需要厨师做很多工作(比如做沙拉,或者把东西放进烤箱等着),一些饭菜可能会因为厨师忙而延迟。另一方面,如果厨师只是要烤一堆东西,他没有多少工作要做,他可以在等待烤箱里的食物做好的同时做其他的饭菜

有了多个厨师,这些任务中的许多可以同时完成。可以同时准备许多饭菜

Apache的线程模型就像雇佣固定数量的厨师(不管餐厅当晚有多少顾客),每个厨师一次只能工作一顿饭。这意味着,如果收到一份餐单,将为该餐指定一名专职厨师。有时厨师会忙着切碎配料和搅拌蛋糕糊,但有时他只是站在那里等着土豆煮开。在任何特定的时间,你都可以让你的大多数厨师无所事事地坐着,等待土豆煮沸和蛋糕烘烤,而不会再下订单,因为每个厨师一次只下一道菜

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

Nginx是另一个您没有询问的web服务器(通常用作代理),但我将其包括在内以解释另一个线程模型。它还雇佣了固定数量的厨师,但雇佣的厨师更少。每个厨师一次可以做多种食物。所以,如果他们在等土豆煮,而有人来点切碎的沙拉,他们可以去做沙拉,而不是无所事事地站着。你可以有一个更小的厨房(相对于餐厅的大小/顾客的数量),并且可以得到相同数量的饭菜,或者更多。这是一个紧密的团队,有效地避免浪费时间和资源

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


综上所述,我们使用了不同的线程模型来划分工作并有效地进行处理。哪个线程模型有意义取决于您的需要以及您选择的服务器的其他特性。

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

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

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

Async-所有带有回调函数的代码实际上都不是异步的。 好的,换句话说,从字面上看,它们是异步的