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

标签 multithreading node.js apache

我读过有关 node.js 和其他服务器(例如 Apache)的信息,它们的线程不同。我只是不明白线程是什么意思。

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

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

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

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

最佳答案

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

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

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

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

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

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

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

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

关于multithreading - 说 Apache 为每个请求生成一个线程,但 node.js 没有,这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324442/

相关文章:

c# - 在 Monitor.Enter 锁中使用复杂对象是否有任何副作用?

c# - ASP.net Web 应用程序,通过创建服务向浏览器推送通知

java - Webapp java同步对象获取

node.js - TypeError : this. 模型不是函数

linux - 将 http 符号链接(symbolic link)重定向到 https

php - Apache 低空闲工作人员但不是最大请求

Java多线程解析txt文件

node.js - 从 API 响应中打开 PDF 到 Angular 中的新选项卡

mysql - 具有单个应用程序服务器实例的数据库连接池

java - tomcat没有显示在eclipse中