async/await、生成器和协程之间的关系

问题描述 投票:0回答:1

在 JavaScript 中我们总是有承诺。然后 async/await 进入了该语言,我认为它是对 Promise 的包装。然后生成器进入了带有

yield
关键字的语言,它开始看起来非常像协程。

这个答案指出:

协程和/或生成器可用于实现协作功能。它们不是在内核线程上运行并由操作系统调度,而是在单个线程中运行,直到屈服或完成,从而屈服于程序员确定的其他函数。具有生成器的语言(例如 Python 和 ECMAScript 6)可用于构建协程。 Async/await(见于 C#、Python、ECMAscript 7、Rust)是构建在产生 future/promise 的生成器函数之上的抽象。

它讨论了 async/await 和生成器作为协程实现的包装器。在 Python 中似乎是这样,但现在在 JavaScript 中也是这样吗?

javascript async-await generator coroutine
1个回答
0
投票

据我所知,JavaScript async/await 仍然是 Promise 的包装。它们现在可以通过生成器来实现,但它们仍然像 Promise 一样工作。

如果您不等待 JavaScript 异步函数,它仍然会运行。

async function foo() {
    console.log("foo");
}
foo(); // logs "foo" as expected

但是 Python 协程基于生成器,因此必须使用 asyncio 或从另一个异步函数等待它们。

async def foo():
    print("foo")

foo()
# you get:
#
# Warning (from warnings module):
#   File "test.py", line 4
#     foo()
# RuntimeWarning: coroutine 'foo' was never awaited
#
# and no "foo" prints out
© www.soinside.com 2019 - 2024. All rights reserved.