什么时候应该使用任务而不是协程?

Posted

技术标签:

【中文标题】什么时候应该使用任务而不是协程?【英文标题】:When should a Task be used instead of a coroutine? 【发布时间】:2015-08-09 13:50:20 【问题描述】:

谁能提供关于如何在 python asyncio 模块的 Tasks 和 Coroutines 之间进行选择的实用建议?

如果我要异步实现 某事,我可以执行以下 2 项中的任何一项 -

import asyncio

@asyncio.coroutine
def print_hello():
    print('Hello')

loop = asycio.get_event_loop()
loop.run_until_complete(print_hello)
loop.close()

import asyncio

@asyncio.coroutine
def print_hello():
    print('Hello')

print_task = asyncio.ensure_future(print_hello)

loop = asycio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(print_task))
loop.close()

哪些因素决定了选择上述两种方法中的哪一种?

【问题讨论】:

一般来说,当你想使用yield from将它直接耦合到调用父协程时,你会使用协程。这种耦合是驱动子协程并迫使父协程在继续之前等待子协程返回的原因。另一方面,Task 不必由父协程驱动,因为它可以自己驱动。 this question 是否以令人满意的方式回答了您的问题?我很想将此标记为骗子,但如果您正在寻找更多信息,请告诉我。 另外,loop.run_until_complete(coro) 总是在内部将coro 转换为Task;您至少需要一个Task 来驱动程序。 @dano 另一个问题有很好的理论讨论 - 谢谢!这个问题的目的是了解一种方法可以/应该优先于另一种方法的实际场景 - 当然是从实际经验中。 Difference between coroutine and future/task in Python 3.5?的可能重复 【参考方案1】:

"通常,当您想使用 yield from 将协程直接耦合到调用父协程时,您会使用协程。这种耦合是驱动子协程并迫使父协程在继续之前等待子协程返回的原因. 另一方面,任务不必由父协程驱动,因为它可以驱动自己。 - shongololo

(请不要在cmets中回答)

【讨论】:

以上是关于什么时候应该使用任务而不是协程?的主要内容,如果未能解决你的问题,请参考以下文章

回调函数 协程

什么时候使用程序,什么时候使用函数?

线程和协程有啥区别呢?

asio 使用_future 而不是 yield[ec]

06爬虫-异步协程

有什么方法可以根据文件的存在而不是具体时间来触发cron任务的运行?