草庐IT

javascript - 什么函数被放入 Node Js 和 JS 的事件循环中

coder 2024-07-18 原文

我一直在阅读一些 NodeJs 文章以了解其异步性质,在此期间我发现了它并且非常喜欢它 Node.js, Doctor’s Offices and Fast Food Restaurants – Understanding Event-driven Programming

EventLoop 是一种基于 FIFO 的队列。他们说当异步函数被命中时,它会被放入 EventLoop 并将继续在那里执行。

我在这里有点困惑。例如据说here :

In actuality, async functions like setTimeout and setInterval are pushed onto an queue known as the Event Loop.

在同一篇文章中:

The Event Loop is a queue of callback functions. When an async function executes, the callback function is pushed into the queue. The JavaScript engine doesn't start processing the event loop until the code after an async function has executed.

但它与这张图不同:

让我们看下面的例子:

console.log("Hello,");
setTimeout(function(){console.log("World");},0);

所以根据我对这些不同解释的理解,

  1. 第一个说 function(){console.log("World"); setTimeout() 函数的一部分,即回调,将被放置在事件循环中。 setTimeout 完成后,它也会执行 EventLoop
  2. 另一个说,整个事情 setTimeout(function(){console.log("World");},0); 将被放入 EventLoop 并被执行...

我现在更糊涂了。它应该很简单,但我想对于以下问题,一个好的但简单的解释对我来说会很好:

  1. 上述哪一项是正确的?
  2. 什么是事件循环?一个类比,一个有方法、对象等的真实事物?
  3. 如果我想从头开始实现与 EventLoop 类似的东西,它看起来会怎样?也许一些代码会很高兴看到。

最佳答案

只需将 Node 的 事件循环 视为在客户端循环的“主要功能”(除了 Node 在服务器端,从技术上讲,您的代码中不需要事件循环,因为它是基于事件的:)。

将每个连接的客户端想象成一个 JS 对象,它再次运行您的代码,在它自己的地址空间中,有它自己的变量,但在完全相同的进程和完全相同的 CPU 中程序的其余部分(您可以将其聚类,但通常这就是开箱即用的方式)。

工作线程是阻塞 I/O 被分割成的部分,使用插件,你甚至可以将工作线程分散到不同的 Node 服务器(文件 I/O、数据库 I/O、网络访问等,都被放入工作线程)。

虽然您创建的事件被放入队列中,但当它被执行时,它会在主事件循环(某种程度上)中运行,但更重要的是,事件本身被放置在事件循环中(将调用它的触发器).

这是 V8 引擎(即事件循环)的全部组成部分。 Node 如此出色的原因在于它允许成千上万的客户端进入同一个循环,并隔离阻塞 I/O。

这里的主要要点是:Node 总是在需要做某事时做某事,总是。

与其他框架一样,I/O 会阻止其余代码的执行。

基本上,您通常编写的几乎所有内容都会在事件循环中发生,但不完全是。应该发生的是您的代码运行一次,然后它只是插入事件,然后退出。

这有意义吗?

So, while your code is done running, any events you queued up, (including more of your code, for example) still resides in the event loop.

Node 与其他一切都非常不同,但这是一个很好的入门解释。

如果您有兴趣,我在 Quora 上写了很多详细信息... https://www.quora.com/How-good-is-Node-js

关于javascript - 什么函数被放入 Node Js 和 JS 的事件循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596172/

有关javascript - 什么函数被放入 Node Js 和 JS 的事件循环中的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐