asynchronous - asyncio 和 node.js 事件循环真的是异步的吗?
问题描述
我假设异步的定义如下。
- 让我们从两个“事物”之间的关系开始:X 和 Y。
- 它们可以是任何东西,例如 X 可以是你,Y 可以是你的洗衣机。
- 假设 X向 Y请求某些东西。
- 这也可以是任何东西:一个问题,一个任务。
- 假设我们生活在一个 Y 无法立即回复answer / completion status的世界中。
- 怎么了?
- 在同步关系中,您以某种方式“等待”。
- 这可能涉及只是坐在那里或反复询问。
- 在异步关系中,你继续你的生活。
- 完成后 Y 会 ping 你。
- 在同步关系中,您以某种方式“等待”。
- 怎么了?
从用户 API 的角度来看,node.js 和 asyncio似乎是异步的。例如,在 node.js 中,您可以在某些事件完成时注册回调。在 asyncio 中,回调逻辑紧跟在一些await my_io()
.
但这是我的问题 - node.js 和 asyncio 实际上真的是异步的吗?在实现方面,他们只是在搞一堆疯狂的非阻塞“嘿,这个文件描述符是免费的吗?” 调用还是实际上是中断驱动的?
解决方案
是的,根据您的定义,它们确实是异步的,您(即 Node 引擎/Python 解释器)在等待任务完成的同时继续做其他工作。
它是如何实现的对你来说并不重要——你相信设计师代表你做出了正确的设计决定。如果有疯狂的“嘿,这个文件描述符是免费的吗?” 继续进行(称为“轮询”或“旋转等待”),这是由已分派线程等待的引擎处理的实现细节。
顺便说一句,忙碌等待有时是在某些情况下(通常,当您期望它很快可用时)等待资源的一种有效方式,可以替代中断或通知。
可以这样想:如果您正在等待洗衣机完成负载,并且您希望在完成其他任务时准确(或尽可能准确地)收到通知,您可以打电话给您的朋友观看给你洗衣服。合同是你的朋友在洗完衣服后尽快通知你,但你不在乎他们是怎么做的。也许他们站在机器旁边检查它是否经常完成(如果负载几乎完成,这是一个好主意),或者他们很聪明并且设计了一个系统,这样他们就可以在不经常检查的情况下完成其他工作。无论哪种方式,它都不会影响您执行其他任务的能力。
“朋友”就像 Node 引擎调度的线程,而“洗衣”可能是文件、HTTP 响应等。从您的角度来看,它是真正的异步——完成资源请求所花费的工作是由一个由运行时、操作系统或网络生成的线程,并与您的进程并行运行。
有关显示异步和同步之间区别的图表,请参见此答案。
推荐阅读
- scala - Marathon 中需要报价的实例包含已启动或已销毁的任务
- c# - Windows BLE GattValueChangedEventArgs.Characteristic.Value 缺失数据
- android - Android API 23 - 在保持网络活动的同时打开/关闭屏幕?
- java - 为什么缺少 Google OAuth 2.0 nonce
- javascript - 如何将 div 的客户端分页更改为服务器端分页?
- encryption - 从哪里开始加密用户密码?
- core-data - 如何在小部件中显示应用程序中的数据?
- amazon-web-services - 索引状态管理 - 将副本设置为 0 移动到超温存储后失败
- reactjs - 搜索/过滤功能在测试时在本地工作,但在部署到 gh-pages 时不起作用。控制台没有错误
- google-fit - 沙盒 Google Fit 环境?