异步(python)如何工作? [复制]

Posted

技术标签:

【中文标题】异步(python)如何工作? [复制]【英文标题】:How does asyncio (python) work? [duplicate] 【发布时间】:2015-05-20 06:26:13 【问题描述】:

Yield from coroutine vs yield from task

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

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

当你做类似的事情时:

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

理想情况下,两个任务并行启动,并且可以使用通道同时通信。

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

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

【问题讨论】:

'yield from' 提供了一个点,此时 asyncio 可以在任务之间主动跳转,这样阻塞操作就不会妨碍其他任务的运行。实际的并行性需要使用 concurrent.futures 模块中的 ThreadPoolExecutor 或 ProcessPoolExecutor,它们可以使用 run_in_executor() 方法在 asyncio 中运行。 【参考方案1】:

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

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

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

【讨论】:

以上是关于异步(python)如何工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#异步递归函数不能正常工作? [复制]

Python 列表是如何工作的? [复制]

Python中的@符号如何工作? [复制]

python的queue.Queue.put()方法是异步的吗? [复制]

如何在 Python 中获取最近的工作日? [复制]

过滤在 Python 中是如何工作的? [复制]