asyncio和node.js事件循环真的异步吗?



我假设异步的定义

  • 让我们从两个"事物"之间的关系开始:X和Y。
    • 它们可以是任何东西,例如X可以是你,Y可以是你的洗衣机。
    • 我们说X请求Y的某部分。
      • 这也可以是任何东西:一个问题,一个任务。
      • 假设我们生活在一个Y不能立即回应答案的世界/完成状态
        • 会发生什么?
          • In aSynchronous在一段感情中,你会在某种程度上"等待"。
            • 这可能只是坐在那里或反复询问。
          • 异步中关系,你继续你的生活。
            • 完成后Y会提示你。

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

但是我的问题是——node.js和asyncio真的是异步的吗?从实现的角度来看,他们只是参与了一堆疯狂的非阻塞的"嘿,这个文件描述符空闲了吗?"调用还是实际上是中断驱动的?

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

如何实现对你来说并不重要——你相信设计师代表你做出了正确的设计决策。如果出现混乱"嘿,这个文件描述符空闲了吗?"这叫做"民意调查"。或者"旋转等待",这是一个由引擎处理的实现细节,它已经分配了一个线程来等待。

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

这样想:如果你正在等待洗衣机洗完一件衣服,当你在做其他事情的时候,你想要准确地(或尽可能精确地)得到洗衣机洗完的通知,你可以打电话给你的朋友帮你看衣服。合同规定,你的朋友洗好衣服后会尽快通知你,但你不关心他们是怎么洗的。也许他们站在机器旁边,检查机器是否一直在工作(如果负载几乎完成,这是个好主意),或者他们很聪明,设计了一个系统,这样他们就可以在不经常检查的情况下做其他工作。不管怎样,它都不会影响你完成其他任务的能力。

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

请参阅此回答,查看显示异步和同步之间区别的图表。

最新更新