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/