这是该问题的后续问题:
Why do most asyncio examples use loop.run_until_complete()?
我正试图弄清楚异步编程如何在python中工作。有一些我不太确定的基本知识。
当具有以下行代码:asyncio.ensure_future(someTask)
时,此行是否会真正进入默认事件循环中返回的Future
并启动任务?还是我还需要在此之前调用loop.run_until_complete(someTask)
(或其他某种运行方式)才能启动并运行事件循环?
答案 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
。