首页 > 解决方案 > asyncio 和 node.js 事件循环真的是异步的吗?

问题描述

我假设异步的定义如下。

从用户 API 的角度来看,node.js 和 asyncio似乎是异步的。例如,在 node.js 中,您可以在某些事件完成时注册回调。在 asyncio 中,回调逻辑紧跟在一些await my_io().

但这是我的问题 - node.js 和 asyncio 实际上真的是异步的吗?在实现方面,他们只是在搞一堆疯狂的非阻塞“嘿,这个文件描述符是免费的吗?” 调用还是实际上是中断驱动的?

标签: asynchronous

解决方案


是的,根据您的定义,它们确实是异步的,您(即 Node 引擎/Python 解释器)在等待任务完成的同时继续做其他工作。

它是如何实现的对你来说并不重要——你相信设计师代表你做出了正确的设计决定。如果有疯狂的“嘿,这个文件描述符是免费的吗?” 继续进行(称为“轮询”或“旋转等待”),这是由已分派线程等待的引擎处理的实现细节。

顺便说一句,忙碌等待有时是在某些情况下(通常,当您期望它很快可用时)等待资源的一种有效方式,可以替代中断或通知。

可以这样想:如果您正在等待洗衣机完成负载,并且您希望在完成其他任务时准确(或尽可能准确地)收到通知,您可以打电话给您的朋友观看给你洗衣服。合同是你的朋友在洗完衣服后尽快通知你,但你不在乎他们是怎么做的。也许他们站在机器旁边检查它是否经常完成(如果负载几乎完成,这是一个好主意),或者他们很聪明并且设计了一个系统,这样他们就可以在不经常检查的情况下完成其他工作。无论哪种方式,它都不会影响您执行其他任务的能力。

“朋友”就像 Node 引擎调度的线程,而“洗衣”可能是文件、HTTP 响应等。从您的角度来看,它是真正的异步——完成资源请求所花费的工作是由一个由运行时、操作系统或网络生成的线程,并与您的进程并行运行。

有关显示异步和同步之间区别的图表,请参见此答案。


推荐阅读