首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >事件驱动的服务器系统和基于线程的服务器系统有什么不同?

事件驱动的服务器系统和基于线程的服务器系统有什么不同?
EN

Stack Overflow用户
提问于 2014-08-13 07:14:51
回答 1查看 31.1K关注 0票数 38
  • Node.js是一个事件驱动的I/O,它是一个单线程服务器,它对回调进行操作,从不在主线程上阻塞。
代码语言:javascript
运行
复制
1. But how does it manage to non-blocking I/O?
2. if it does easy to manage, why don't thread-based system manage it?
3. Does not work the other threads (behind single event-driven thread) as like thread-based ? 
4. if the other threads mean workers(behind event driven thread) are busy, how it still can handle jobs without blocking?

  • 基于线程的模型将任务分配给线程,如果没有空闲线程,则阻止新任务。
代码语言:javascript
运行
复制
1. if a thread can handle multiple tasks like as event-driven single thread that handles every I/O without blocking, why thread-based system doesn't use this tactic on busy threads to I/O without blocking.

我想知道事件驱动的服务器系统和基于线程的服务器系统有什么不同(优缺点)。

EN

回答 1

Stack Overflow用户

发布于 2014-08-13 07:24:47

这种区别可以描述如下(稍作简化):

  • 在“线程驱动”运行时,当请求传入时,将创建一个新线程,并在该线程中完成所有处理。
  • 在“事件驱动”运行时,当请求传入时,事件将被分派,处理程序将获取它。什么时候?在Node.js中,有一个“事件循环”,它基本上遍历所有需要执行的代码片段,并逐一执行它们。因此,一旦事件循环调用该事件,处理程序将处理它。重要的是,所有处理程序都在同一个线程中调用--事件循环没有使用线程池,它只有一个线程。

在“事件驱动”模型中,如果一个处理程序需要很长时间才能完成(即在该模型中有一个计算密集型的for循环),则在此期间不会处理其他请求,因为事件循环不会在当前处理程序完成之前调用下一个处理程序。这通常不是一个问题,因为Javascript的异步性质。

另一方面,在“线程驱动”模型中,如果处理程序需要大量时间来完成,它不会对其他线程造成太大伤害,因为它们可以同时独立运行。

不幸的是,创建一个新线程会增加一些开销,如果您需要处理数千个并发连接,它可能会成为一个负担。这就是为什么Node.js被认为是快速的--不管您处理了多少个连接,只有一个线程1。您只需要稍微小心一点,不要阻塞任何处理程序,以保持事物的正常运行。幸运的是,大多数时候编写阻塞JavaScript代码并不容易。

同样重要的是要注意,在大多数运行时编写异步代码是可能的。但是,由于Javascript的特性,它在Node.js中的应用最为广泛。因此,您在Node中使用的几乎每个库都将是异步的。

有关事件循环的解释,请参见这篇文章(和图片)

1当然有更多的Node.js进程中的线程,其中有些与I/O相关,但是应用程序逻辑是在一个线程中处理的。

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25280207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档