当前位置: 首页 > 面试题库 >

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

伯逸明
2023-03-14
问题内容

我已经阅读了有关node.js和其他服务器(例如Apache)的信息,其中线程有所不同。我根本不了解线程的含义。

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

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

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

编辑:我希望有一个我可以理解的例子。我已经习惯了访问数据库的服务器端页面。该文件中的几个连接。


问题答案:

线程是程序执行的上下文。单线程程序只能一次执行一项操作,而多线程程序可以一次执行很多操作。

可以把它想象成餐厅里的厨房。一个厨师实际上一次只能完成一项任务,例如切碎意见或放入烤箱。如果接到订单,则需要厨师做大量工作(例如制作沙拉或将材料放入烤箱然后等待),因为该厨师很忙,某些饭菜可能会延迟。另一方面,如果那个厨师只需要烘烤一堆东西,那么他就没有太多工作要做,他可以在等待烤箱里的食物做完的同时做其他饭菜。

在多位厨师的协助下,许多任务可以同时完成。可以同时准备许多餐点。

Apache的线程模型就像雇用固定数量的厨师(无论您的餐馆当晚有多少客户),每个厨师一次只能做一顿饭。这意味着,如果进餐的话,将指派一位专门的厨师来做这顿饭。有时厨师会忙着切碎食材和搅拌面糊,但有时他只是站着等待土豆煮开。在任何给定的时间,您可能会让大多数厨师闲着,等待土豆煮沸,然后烘烤蛋糕,而不再处理任何订单,因为每个厨师一次只能做一个订单。

更糟糕的是,您的厨房只有做得足够大。每个厨师都占用空间和资源,您可能会遇到这样的情况,一堆厨师拿着唯一的汤匙站在旁边,阻碍了其他厨师烹制食物。

Nginx是另一个您不曾问过的Web服务器(通常用作代理),但我将其包含在内以解释另一个线程模型。它还聘用了固定数量的厨师,但聘用的厨师较少。每个厨师一次可以做多餐。因此,如果他们在等待切碎沙拉的订单上等待土豆煮沸,他们可以继续加工该沙拉,而不必闲着闲逛。您可以拥有一个较小的厨房(相对于餐厅大小/客户数量),并获得相同或更多的餐点。这是一个精打细算的工作人员,可以有效地节省时间和资源。

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

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



 类似资料:
  • 我想创建一个

  • 维基百科说Redis是一个内存数据库,但也说它可以“至少每2秒将数据持久化到磁盘”。我觉得这两件事是互相排斥的。它能在磁盘上存储数据,怎么能被认为是内存中的呢?我假设内存中的定义意味着它不存储到磁盘中。 这是一个类似的问题:Redis概念:在内存中还是在DB中?不同的是,他询问的是持久性实现。我的问题是关于内存中与持久性的概念。

  • ELIFECYCLE是什么意思? 我在寻找两个答案中的一个:ELIFECYCLE是什么意思?(或者)为什么我的应用程序代码中出现错误?

  • 阅读的javadocs,我看到方法让我知道事件是否由其结果重复。 返回事件计数。如果事件计数大于1,则这是一个重复事件。 这到底是什么意思?这是否意味着两个或多个对象引用同一个“事件”(例如,正在创建的文件)? 我正在Oracle网站上试验新的API的示例,这一部分让我感到困惑,尤其是因为我会在同一测试代码的连续运行中获得不同数量的事件(其中我使用写入一个文件,而不与之手动交互),但的结果永远不会