asyncio (python) 是如何工作的?

How does asyncio (python) work?

Yield from coroutine vs yield from task

如本问题(第二个答案)所述,“yield from coroutine()”就像调用一个函数。我不明白像 yield from 这样实际上等到协程完成的东西应该如何启用并发和非阻塞操作。

例如,在 Golang 中,您只需通过 go 关键字进行推理。

当您执行以下操作时:

func function1(){
    go function2()
... Some channel communication here
}

理想情况下,这 2 个任务并行启动并且可以使用通道并发通信。

这个任务可以很容易地并行化(增加进程的数量)并且背后的逻辑对我来说更简单。

请有人帮助我理解这些东西。

我认为(公平地说,我不是 python 这方面的专家)答案是协程本身并不能真正为您带来神奇的并行性。协程是一种表达方式 "work on this task until ... and then pause." 在它暂停之后,流程控制可以继续处理其他事情,直到您决定再次启动它。

如果你的协程最终启动了一些可以异步完成的事情——例如如果您可以在协程中启动一个线程,并且该线程正在处理恰好释放 GIL(即 IO)的事情。然后你可以在你的协程中启动线程,然后暂停该执行委托给其他任务。当您完成这些其他任务时,希望您的 IO 将完成并且您可以继续快乐的方式而无需等待 IO。我相信这就是 asyncio 为您所做的。

请注意,如果您正在寻找有关协同例程的好读物,值得一读 this presentation(并发从幻灯片 #75 开始)。