python - 协程 yield 与任务 yield

标签 python python-3.x asynchronous concurrency python-asyncio

Guido van Rossum,在 2014 年关于 Tulip/Asyncio 的演讲中 shows the slide :

Tasks vs coroutines

  • Compare:

    • res = yield from some_coroutine(...)
    • res = yield from Task(some_coroutine(...))
  • Task can make progress without waiting for it

    • As log as you wait for something else
      • i.e. yield from

我完全没有捕获重点。

在我看来,这两种结构是相同的:

在裸协程的情况下 - 它被调度,因此无论如何都会创建任务,因为调度程序与任务一起操作,然后协程调用者协程被挂起,直到被调用者完成,然后可以自由继续执行。

Task 的情况下 - 都一样 - 新任务被调度并且调用者协程等待其完成。

两种情况下代码的执行方式有何不同?开发人员在实践中应该考虑哪些影响?

附言
非常感谢权威来源(GvR、PEP、文档、核心开发人员说明)的链接。

最佳答案

对于调用方协程 yield from coroutine() 感觉就像一个函数调用(即当 coroutine() 完成时它将再次获得控制权)。

另一方面,

yield from Task(coroutine()) 感觉更像是创建一个新线程。 Task() 几乎立即返回,并且调用者很可能在 coroutine() 完成之前重新获得控制权。

f()th的区别 = threading.Thread(target=f, args=()); th.start(); th.join() 很明显了吧?

关于python - 协程 yield 与任务 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27076577/

相关文章:

python - 使用 python 更改 blender 游戏引擎中电枢中的骨骼位置

javascript - 如何使 forEach 循环等待正则表达式替换?

javascript - 如何并行遍历目录树?

javascript - Magento 中的 HTML <script> async 属性

python - 3rd 方库和 Py2exe

Python 函数跟踪

python - 如何通过Python远程访问Bluehost服务器上的MySQL数据库

python - 副窗无槽

python - 字典值的惰性评估?

python - 如何使用 lambda 函数在 python for 循环中捕获 KeyError?