什么是事件循环?它与使用其他模型有什么不同?

cdu*_*ruk 10 javascript parallel-processing functional-programming node.js

我一直在研究Node.JS,所有的文档和博客都讨论了它如何使用事件循环而不是每个请求模型.

我对这种差异有一些困惑.我觉得我80%有理解但尚未完全掌握它.

igo*_*orw 17

线程模型将为每个请求生成一个新线程.这意味着您在计算和内存方面会得到相当多的开销.事件循环在单个线程中运行,这意味着您无法获得开销.

结果是您必须更改编程模型.因为所有这些不同的事情都发生在同一个线程中,所以你无法阻止.这意味着您不能等待某些事情发生,因为这会阻塞整个线程.而是定义一个动作完成后调用的回调.这通常被称为非阻塞I/O.

用于阻止I/O的伪示例:

row = db_query('SELECT * FROM some_table');
print(row);
Run Code Online (Sandbox Code Playgroud)

非阻塞I/O的伪示例:

db_query('SELECT * FROM some_table', function (row) {
  print(row);
});
Run Code Online (Sandbox Code Playgroud)

这个例子使用lambdas(匿名函数),就像它们一直在JavaScript中使用一样.JS大量使用事件,这正是回调的内容.一旦操作完成,就会触发一个触发回调的事件.这就是为什么它通常被称为事件模型异步模型.

此模型的实现使用循环来处理和触发这些事件.这就是它被称为事件队列事件循环的原因.

事件队列框架的突出示例包括:

  • 我认为重要的是要概述事件队列并不意味着没有线程池.例如,node.js在内部大量使用线程池来阻止操作.事件队列模型的变化是如何与这种长期采取行动进行交互的方式. (2认同)

b_e*_*erb 6

将传入请求或回调视为排队和处理的事件.

这与大多数GUI系统完全相同.系统无法知道用户何时单击按钮或进行某些交互.但是当他这样做时,事件将传播到事件循环,事件循环基本上是一个循环,它检查队列中的新事件并处理它们.

优点是,您不必为自己等待结果.而是注册在触发事件时执行的回调函数.这允许框架处理I/O内容,并且在处理长时间的操作而不是自己阻止进程时,您可以轻松地依赖它的内部效率.

简而言之,每个方面都是并行的,但是你的代码.永远不会有两个并发运行的回调函数片段 - 事件循环是一个单独的线程.然而,外部执行内容并最终传播事件的进程可以分布在多个线程/进程中.