【问题标题】:Is the callback handled by the event loop completed?事件循环处理的回调是否完成?
【发布时间】:2021-01-25 16:31:42
【问题描述】:

通过NodeJS的事件循环文档了解到,事件循环处理的回调是已完成的任务。

Libuv的线程处理异步工作是否正确,当它完成后,事件循环从事件队列中拉取工作并返回一个回调?

因为我理解的回调是工作完成后要执行的动作。

如果这个假设是正确的,事件循环什么时候可以阻塞?

此外,事件队列和事件循环仅用于作业完成后的回调执行是没有意义的。

我误会了什么?

【问题讨论】:

  • "事件循环处理的回调是已完成的任务" - 没有。当异步工作完成后,它会在事件循环中调度一个任务(执行回调)。
  • "事件循环从事件队列中提取工作并返回一个回调?" - 不。它从事件队列中提取任务(事件操作)。它执行回调,它不会在任何地方返回它。
  • "事件队列和事件循环仅用于工作完成后的回调执行是没有意义的" - 为什么不呢?
  • yesterday's question 的可能重复项

标签: javascript node.js v8 libuv


【解决方案1】:

libuv的线程处理异步工作对吗

有些异步工作是由 libuv 线程处理的,有些则不是。例如,网络使用已经异步工作且不使用或不需要线程的操作系统 API。 nodejs 有自己的定时器实现,不使用线程。

当它完成时,事件循环从事件队列中拉出工作并返回一个回调?

当一个异步作业完成时,它会将一个事件插入到事件队列中。当轮到该事件从事件队列中被拉出时,它会触发一个回调被调用。

如果这个假设是正确的,事件循环什么时候可以阻塞?

只要前一个事件的回调仍在执行,事件循环就会被阻塞。一次处理一个事件。

此外,事件队列和事件循环仅用于作业完成后的回调执行是没有意义的。

我不确定您的困惑到底在哪里。处理事件后,将调用回调并开始运行。如果正在完成的工作有进一步的异步工作,那么该回调将启动一个或多个额外的异步操作,然后它会返回到事件队列(回调将返回)。

此时,操作想要完成的工作尚未完全完成(有一些新的未完成的异步操作),但就事件循环而言,回调返回并且回调本身已完成,因此事件循环找到下一个准备运行的事件。

在未来的某个时间点,那些刚刚开始的异步操作将完成,并在它们被调用时将一个事件插入事件循环,更高级别的操作将朝着其最终目标取得进一步进展。因此,通过这种方式,为某些更高级别操作服务的一系列异步操作不会在整个持续时间内阻塞事件循环,只会在执行过程中的一小段执行过程中,当更大的操作有机会运行其他事情时等待异步操作完成。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2012-07-11
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多