Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 事件驱动和基于线程的服务器系统之间有什么区别?_Multithreading_Node.js_Threadpool_Event Driven - Fatal编程技术网

Multithreading 事件驱动和基于线程的服务器系统之间有什么区别?

Multithreading 事件驱动和基于线程的服务器系统之间有什么区别?,multithreading,node.js,threadpool,event-driven,Multithreading,Node.js,Threadpool,Event Driven,Node.js是一个事件驱动的I/O,它是一个单线程服务器 作用于回调,从不在主线程上阻塞 但它是如何实现无阻塞I/O的呢 如果它很容易管理,为什么基于线程的系统不管理它呢 其他线程(在单事件驱动线程之后)是否与基于线程的线程一样工作 如果其他线程意味着工作线程(在事件驱动线程后面)很忙,那么它如何在不阻塞的情况下处理作业 基于线程的模型将任务分配给线程,如果没有 空闲线程,阻止新任务 如果一个线程可以处理多个任务,比如事件驱动的单线程 处理每个I/O而不阻塞的线程,为什么基于线程 系统不会在

Node.js是一个事件驱动的I/O,它是一个单线程服务器 作用于回调,从不在主线程上阻塞

  • 但它是如何实现无阻塞I/O的呢
  • 如果它很容易管理,为什么基于线程的系统不管理它呢
  • 其他线程(在单事件驱动线程之后)是否与基于线程的线程一样工作
  • 如果其他线程意味着工作线程(在事件驱动线程后面)很忙,那么它如何在不阻塞的情况下处理作业
  • 基于线程的模型将任务分配给线程,如果没有 空闲线程,阻止新任务

  • 如果一个线程可以处理多个任务,比如事件驱动的单线程 处理每个I/O而不阻塞的线程,为什么基于线程 系统不会在繁忙线程上使用此策略,以便在没有 阻塞

  • 我想知道事件驱动服务器系统和基于线程的服务器系统之间有什么区别(优点/缺点)。

    区别可以描述如下(经过一些简化):


    • 在“线程驱动”运行时中,当请求传入时,将创建一个新线程,所有处理都在该线程中完成

    • 在“事件驱动”运行时中,当请求传入时,事件被调度,处理程序将拾取它。什么时候在Node.js中,有一个“事件循环”,它基本上循环所有需要执行的代码片段,并逐个执行它们。因此,一旦事件循环调用该事件,处理程序将处理该事件。这里重要的是,所有处理程序都在同一个线程中调用——事件循环没有线程池可供使用,它只有一个线程

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

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

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

    还需要注意的是,在大多数运行时都可以编写异步代码。但由于Javascript的特性,它在Node.js中的应用最为广泛。由于这一点,实际上您在Node中使用的每个库都是异步的

    有关事件循环的说明,请参见


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

    related:,并且“当请求传入时,会创建一个新线程”。如果服务器使用线程池,这不是真实的陈述