run_until_complete和sure_future之间的Python关系

时间:2018-08-12 12:34:19

标签: python python-asyncio

这是该问题的后续问题:

Why do most asyncio examples use loop.run_until_complete()?

我正试图弄清楚异步编程如何在python中工作。有一些我不太确定的基本知识。

当具有以下行代码:asyncio.ensure_future(someTask)时,此行是否会真正进入默认事件循环中返回的Future并启动任务?还是我还需要在此之前调用loop.run_until_complete(someTask)(或其他某种运行方式)才能启动并运行事件循环?

2 个答案:

答案 0 :(得分:1)

  

asyncio.ensure_future(someTask)   此行是否会真正使默认事件循环中返回的Future排队并启动任务?

它将安排协程,但不会运行。您仍然需要运行循环来执行此操作。您可以使用

loop.run_forever()

如果您希望循环运行到someTask完成而不是永远执行,请使用

future = asyncio.ensure_future(someTask)
loop.run_until_complete(future)

不要同时呼叫asyncio.ensure_future(someTask)loop.run_until_complete(someTask),否则您将得到RuntimeError,因为someTask已经安排好了。

答案 1 :(得分:0)

  

当具有以下行代码:asyncio.ensure_future(someTask)时,此行是否会真正进入默认事件循环中返回的Future并启动任务?

这取决于何时执行该行。如果它在事件循环运行时从某个协程执行,那么您真的不需要要做任何其他事情-该任务似乎将神奇地在“后台”运行。

如果事件循环尚未运行,则需要启动事件循环以运行任何任务,而不仅仅是刚添加的任务。 loop.run_until_complete(some_specific_task)只是一个选项,另一个是loop.run_forever(),表示“运行事件循环,直到有人调用loop.stop()”。

请注意,ensure_future(task)是禁止操作的,因为如果您已经拥有Task,它将被原样返回。 ensure_future(some_coroutine())将协程包装到Task中,在事件循环中安排它,然后返回它,为您有效地调用loop.create_task()。如果知道该参数是协程,则recommended直接调用create_task