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

Node.js事件循环滴答到底是什么?,第1张

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 ++库调用的所有本机模块看起来都是异步的


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5020055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存