微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是Node.js事件循环?

我已经越来越多地进入node.js架构的内部,我看到很多的一个术语是“tick”如“事件循环的下一个tick”或函数 nextTick()

我没有看到的是一个坚实的定义什么确切的“蜱”是。基于各种文章(such as this one),我已经能够把一个概念一起在我的头,但我不知道它是多么准确。

我可以得到一个node.js事件循环tick的精确和详细的描述吗?

解决方法

请记住,虽然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)(实际上不存在于节点的源代码中;这只是说明性的)表示事件循环。 inner用于为队列中的每个事件调用JS函数

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

什么可以添加到队列中的东西?

> process.nextTick
> setTimeout / setInterval
> I / O(来自fs,net等的东西)
> crypto的处理器密集型功能,如加密流,pbkdf2和PRNG(实际上是…的示例)
>使用libuv work queue使任何同步C/C++库调用看起来异步的任何本机模块

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐