asyncio(python)是如何工作的?

asyncio(python)是如何工作的?,python,concurrency,parallel-processing,python-asyncio,Python,Concurrency,Parallel Processing,Python Asyncio,正如在这个问题(第二个答案)中所报告的那样,“yieldfromcoroutine()”就像调用函数一样。我不明白像yield from这样的东西,实际上要等到协同路由完成后才能启用并发和非阻塞操作 例如,在Golang中,您只需使用go关键字进行推理 当您执行以下操作时: func function1(){ go function2() ... Some channel communication here } 理想情况下,两个任务并行启动,并且可以使用通道并发通信 这些任务可以很容

正如在这个问题(第二个答案)中所报告的那样,“
yieldfromcoroutine()
”就像调用函数一样。我不明白像yield from这样的东西,实际上要等到协同路由完成后才能启用并发和非阻塞操作

例如,在Golang中,您只需使用go关键字进行推理

当您执行以下操作时:

func function1(){
    go function2()
... Some channel communication here
}
理想情况下,两个任务并行启动,并且可以使用通道并发通信

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

请有人帮我理解这件事

我认为(公平地说,我不是python这方面的专家)答案是协同程序本身并不能真正为您带来神奇的并行性。协同程序是一种表示“在…之前处理此任务,然后暂停”的方式。在它暂停后,流控制可以继续处理其他任务,直到您决定再次启动它

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


请注意,如果您正在寻找有关co例程的详细信息,那么值得一看(并发性从幻灯片#75开始)。

“屈服于”提供了一个点,异步IO可以在任务之间主动跳跃,以便阻塞操作不会妨碍其他任务的运行。实际并行性需要使用concurrent.futures模块中的ThreadPoolExecutor或ProcessPoolExecutor,可以使用run_in_executor()方法在异步IO中运行。