何时应该使用任务(Task)而不是协程(coroutine)?

12

有人能提供一些实际的建议来帮我选择 Python asyncio 模块的 Tasks 和 Coroutines 吗?

如果我想要异步地完成 某件事情,我可以采用以下两种方式之一 -

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()

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


4
通常在您想要将其直接与调用父协程耦合使用 yield from 时,会使用协程。这种耦合驱动子协程并强制父协程等待子协程返回后才能继续。另一方面,任务不必由父协程驱动,因为它可以自行驱动。 - songololo
这个问题的回答是否令您满意?我想将其标记为重复,但如果您需要额外的信息,请告诉我。 - dano
1
此外,loop.run_until_complete(coro) 总是在内部将 coro 转换为一个 Task;你需要至少一个 Task 来驱动程序。 - dano
@dano 另一个问题有一个很好的理论讨论,谢谢!这个问题的目的是了解在实际场景中,一个方法可以/应该优先使用另一个方法的实际经验。 - Rohit Atri
Task 提供了诸如取消和检查堆栈帧等精细控制。如果可能的话,我建议使用 coroutine,这有助于保持逻辑简单和清晰。 - Huazuo Gao
1
可能是Python 3.5中协程和Future/Task的区别?的重复问题。 - Bharel
1个回答

1
"一般情况下,当您想要直接将协程与调用父协程耦合使用yield from时,可以使用协程。这种耦合是驱动子协程并强制父协程在继续之前等待子协程返回的原因。另一方面,任务不必由父协程驱动,因为它可以自己驱动。" - shongololo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接