使用点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
.