我已经阅读过有关node.js和其他服务器的信息,例如Apache,其中线程不同。我根本不明白线程的含义。
如果我有一个运行SQL的网页来命中数据库,比如在一个服务器端页面中说三个不同的数据库,这对于node.js中的线程是什么意思? Apache的? “线程”在这里意味着什么?
或者作为我看到的一篇文章,“开始一个新线程来处理每个请求。”
说Apache为每个请求生成一个线程是什么意思,但是node.js没有?
编辑:我希望有一个我能掌握的例子。我习惯于拥有一个可以访问数据库的服务器端页面。该文件中有几个连接。答案 0 :(得分:48)
线程是程序执行的上下文。单线程程序一次只能做一件事,多线程程序可以同时做很多事情。
把它想象成餐厅的厨房。一个厨师实际上一次只能完成一项任务,即砍掉意见或将某些东西放入烤箱。如果订单需要大厨的大量工作(例如制作沙拉而不是将东西放入烤箱等待),由于厨师很忙,一些饭菜可能会延误。另一方面,如果那位厨师只需要烘烤一堆东西,那么他就没有多少工作要做,他可以在等待烤箱里的食物的同时做其他的饭菜。
有多位厨师,其中许多任务可以同时完成。许多餐点可以同时准备。
Apache的线程模型就像雇用固定数量的厨师(无论您的餐厅当晚有多少客户),每位厨师一次只能吃一顿饭。这意味着如果进餐订单,则会为该餐提供专门的厨师。有些时候,那位厨师正在忙着切碎配料和混合蛋糕面糊,但也有时候他会站在那里等待土豆煮沸。在任何时候,你可以让你的大多数厨师闲置,等待土豆煮沸和蛋糕烘烤,不再订单,因为每个厨师一次只能为一个订单。
更糟糕的是,你的厨房只有你能负担得起的那么大。每个厨师都占用了空间和资源,你可能会遇到一群厨师站在周围拿着唯一的勺子可以阻止其他厨师制作他们的食物。
Nginx是另一个你没有问过的网络服务器(通常用作代理),但我将它包括在内以解释另一个线程模型。它还雇用了固定数量的厨师,但雇用的人数较少。每位厨师可以一次多餐。因此,如果他们等待土豆煮沸,而订单进来切碎的沙拉,他们可以去吃沙拉,而不是闲着站着。您可以拥有一个较小的厨房(相对于餐厅的大小/客户数量)并获得相同数量的餐点或更多。这是一个紧张的工作人员,不会浪费时间和资源。
Node.js有点不同。从JavaScript的角度来看,它是单线程的,但是其他任务(如磁盘和网络IO)会在不同的线程上自动处理。这就像拥有只有一位厨师的厨房,但在某些情况下这是有道理的。如果你的厨房为那位厨师做了很多忙碌的工作,也许雇用更多的厨师来做工作是有道理的。 (要在Node.js中执行此操作,您只能生成更多进程,这实际上就像构建一堆紧挨着的小厨房。您可以让一个人站在前面协调所有这些厨房的订单。)但是如果你只是一家面包店(主要是IO,主厨很少忙),也许你只需要一位厨师。
总而言之,不同的线程模型用于划分工作并有效地处理它。哪种线程模型有意义取决于您的需求以及您选择的服务器的其他特性。
答案 1 :(得分:1)
Node.js是单线程的,因为它一次只能做一件事。但是,您可以在几乎所有云服务提供商上运行节点进程的多个实例。 apache进程可以在线程上进行多任务。
如果节点进程由于某种原因挂起,则不会发生任何其他情况。这就是为什么以异步方式编写节点非常重要,这样如果数据库查询挂起,节点仍然可以接收请求。
如果没有太过技术性,可以将线程视为程序高速公路中的一条线。它是一个特定的执行渠道。在请求的生命周期中,很多事情都必须发生。所有这些都在一个盒子里。
节点没有线程!你可以把它想象成一条单行道。但是,部署节点的方式会让您获得该单行道路的许多实例。他们不分享任何东西。如果将值添加到一个数组中,则不在另一个数组中。任何需要共享的东西都必须在缓存或数据库层中共享。
答案 2 :(得分:0)
人们混淆的是线程,进程和异步,非阻塞I / O。
线程是进程的子级“可运行”。为线程设置了所有执行环境。从堆栈到可寻址内存位置,它都已分配给线程。如果子级线程必须与主进程线程通讯,则必须使用安全消息通知模型。根据语言,有多种方法可以做到这一点。
Node.js是单线程的,并且显然是基于单个进程的。这并不意味着需要占用大量CPU资源的阻塞调用。但是,如果仍然要使用,则可以考虑使用节点群集。因此,与其创建线程,不如创建一个像线程一样工作的多个“进程”。
异步-带有回调函数的所有代码实际上都不是异步的。 好的,换句话说,从字面上看,它们是异步的,因为它们不会阻止呼叫。
但是在Node.js上下文中,当有人说Node是异步的时,它已完全链接到OS接口。节点的能力取决于底层操作系统的非阻塞I / O能力。因此,无论操作系统支持哪种对象,例如套接字,文件,管道,节点,非阻塞I / O都会最大限度地利用它们。
顺便说一句,当谈到Apache时,理想情况下应该比较Nginx。不是Node.js。 Node.js不能用作Web服务器。这基本上是一个可以有效使用异步I / O的过程。