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

joh*_*nny 10 apache multithreading node.js

我已经阅读过有关node.js和其他服务器的信息,例如Apache,其中线程不同.我根本不明白线程的含义.

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

或者作为我看到的一篇文章,"开始一个新线程来处理每个请求."

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

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

Bra*_*rad 49

线程是程序执行的上下文.单线程程序只能同时执行一项操作,多线程程序可以同时执行多项操作.

把它想象成餐厅的厨房.一个厨师实际上一次只能完成一项任务,就是砍掉意见或把东西放在烤箱里.如果订单需要大厨的大量工作(例如制作沙拉而不是将东西放入烤箱等待),由于厨师很忙,一些饭菜可能会延误.另一方面,如果那位厨师只需要烘烤一堆东西,他就没有多少工作要做,他可以在等待烤箱里的食物的同时做其他的饭菜.

有多位厨师,其中许多任务可以同时完成.许多餐点可以同时准备.

Apache的线程模型就像聘请固定数量的厨师(无论您的餐厅当晚有多少客户),每位厨师一次只能吃一顿饭.这意味着如果进餐订单,则会为该餐提供专门的厨师.有时候那位厨师正在忙着切碎配料和混合蛋糕面糊,但也有时他会站在那里等待土豆煮沸.在任何时候,您可以让大多数厨师闲置,等待土豆煮沸和蛋糕烘烤,不再订购任何订单,因为每个厨师一次专用于一个订单.

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

Nginx是另一个你没有问过的Web服务器(通常用作代理),但我将其包含在内以解释另一个线程模型.它还雇用了固定数量的厨师,但雇用的人数较少.每位厨师可以一次多餐.因此,如果他们等待土豆煮沸,而订单进来切碎的沙拉,他们可以去吃沙拉,而不是闲着站着.您可以拥有一个较小的厨房(相对于餐厅的大小/客户数量)并获得相同数量的餐点或更多.这是一个紧张的工作人员,不会浪费时间和资源.

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

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

  • 很好的答案.我将来会使用厨房比喻. (3认同)
  • @johnny V8没有,也不能为运行JavaScript创建多个线程.您的JavaScript始终在单个线程中运行.假设我有一些调用`fs.readfile()`的JavaScript.标准库中还有一些额外的JavaScript,但最终有一些JavaScript告诉V8调用最初用C语言编写的本机编译代码.该本机代码可以在此时执行任何操作,Node.js的库确实为本机代码中的内容创建了一个线程池.当需要将数据发送回JavaScript时,它会回到主循环,单线程. (2认同)