使用点asyncio.Task(coro())是针对您不想显式等待的情况coro,但您希望coro在等待其他任务时在后台执行。这就是 Guido 的幻灯片的意思
[A]不等Task就可以进步……只要你等别的
考虑这个例子:
import asyncio
@asyncio.coroutine
def test1():
print("in test1")
@asyncio.coroutine
def dummy():
yield from asyncio.sleep(1)
print("dummy ran")
@asyncio.coroutine
def main():
test1()
yield from dummy()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
输出:
dummy ran
如您所见,test1它从未真正执行过,因为我们没有明确地调用yield from它。
现在,如果我们用asyncio.async包裹一个Task实例test1,结果会有所不同:
import asyncio
@asyncio.coroutine
def test1():
print("in test1")
@asyncio.coroutine
def dummy():
yield from asyncio.sleep(1)
print("dummy ran")
@asyncio.coroutine
def main():
asyncio.async(test1())
yield from dummy()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
输出:
in test1
dummy ran
因此,使用 确实没有实际理由yield from asyncio.async(coro()),因为它比yield from coro()没有任何好处要慢;它引入了添加coro到内部asyncio调度程序的开销,但这不是必需的,因为无论如何使用将要执行的yield from保证。coro如果你只是想调用一个协程并等待它完成,yield from直接调用协程即可。
边注:
我使用asyncio.async* 而不是Task直接使用,因为文档推荐它:
不要直接创建Task实例:使用async()函数或BaseEventLoop.create_task()方法。
* 请注意,从 Python 3.4.4 开始,asyncio.async不推荐使用asyncio.ensure_future.