在 JavaScript 中我们总是有承诺。然后 async/await 进入了该语言,我认为它是对 Promise 的包装。然后生成器进入了带有
yield
关键字的语言,它开始看起来非常像协程。
这个答案指出:
协程和/或生成器可用于实现协作功能。它们不是在内核线程上运行并由操作系统调度,而是在单个线程中运行,直到屈服或完成,从而屈服于程序员确定的其他函数。具有生成器的语言(例如 Python 和 ECMAScript 6)可用于构建协程。 Async/await(见于 C#、Python、ECMAscript 7、Rust)是构建在产生 future/promise 的生成器函数之上的抽象。
它讨论了 async/await 和生成器作为协程实现的包装器。在 Python 中似乎是这样,但现在在 JavaScript 中也是这样吗?
据我所知,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