栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Node.js事件循环滴答到底是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Node.js事件循环滴答到底是什么?

请记住,虽然Javascript是单线程的,但是节点的所有I /
O和对本机API的调用都是异步的(使用特定于平台的机制),或者在单独的线程上运行。(这些都是通过libuv处理的。)

因此,当套接字上有可用数据或本机API函数返回时,我们需要一种同步方式来调用对刚刚发生的特定事件感兴趣的Javascript函数。

出于与常规多线程应用程序中遇到的相同原因-竞争条件,非原子内存访问等原因,仅从发生本机事件的线程中调用JS函数是不安全的。

因此,我们要做的是以线程安全的方式将事件放在队列中。在过度简化的伪代码中,如下所示:

lock (queue) {    queue.push(event);}

然后,回到主要的Javascript 线程 (但在C方面),我们执行以下操作:

while (true) {    // this is the beginning of a tick    lock (queue) {        var tickEvents = copy(queue); // copy the current queue items into thread-local memory        queue.empty(); // ..and empty out the shared queue    }    for (var i = 0; i < tickEvents.length; i++) {        InvokeJSFunction(tickEvents[i]);    }    // this the end of the tick}

while (true)
(这实际上不存在于节点的源代码;这是纯说明性)表示 事件循环 。内部组件
for
为队列中的每个事件调用JS函数。

这是一个勾号:与任何外部事件关联的零个或多个回调函数的同步调用。清空队列并返回最后一个函数后,刻度结束。我们返回到开头(下一个刻度),并检查
在Javascript运行时 从其他线程添加到队列的事件。

什么可以将内容添加到队列中?

  • process.nextTick
  • setTimeout
    /
    setInterval
  • I / O(来自
    fs
    net
    等的东西)
  • crypto
    的处理器密集型功能,例如加密流,pbkdf2和PRNG(实际上是…的示例)
  • 使用libuv工作队列进行同步C / C ++库调用的所有本机模块看起来都是异步的


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号