asyncio.wait_for()的目的

joh*_*rce 2 coroutine python-3.4 python-asyncio

据我了解,从协程中的协程产生的结果将线程控制传递给事件循环。

然后,事件循环在其他协程(在其中,从协程产生的协程)之间进行某种调度,并在某个时间点恢复称为yield from的协程。

与将协程包装在ansyncio.wait_for调用中并从后者中产生什么有什么不同?

kwa*_*nek 6

wait_for增加了超时。例如,从网络检索数据的时间太长(让我们用异步睡眠对其进行模拟)甚至更糟,您最终可能只会遇到错误。

@coroutine
def fetch_data():
    yield from asyncio.sleep(100000)
    raise Exception('No data')
Run Code Online (Sandbox Code Playgroud)

然后,纯收益将等待100000秒,而用户却一无所获

data = yield from fetch_data() 
Run Code Online (Sandbox Code Playgroud)

另一方面,wait_for添加了时间约束:

data = yield from wait_for(fetch_data(), 5)
Run Code Online (Sandbox Code Playgroud)

它只会等待5秒,并且要么返回数据,要么引发TimeoutError。当然,这样的超时是两刃剑。

wait_for是常见情况的执行,没有什么特别的。

更新为 async/await

现在,使用更新的async / await语法,以上示例将如下所示:

async def fetch_data():
    await asyncio.sleep(100000)
    raise Exception('No data')

data = await fetch_data()
Run Code Online (Sandbox Code Playgroud)

如果要在有时间限制的情况下等待:

data = await asyncio.wait_for(fetch_data(), 5)
Run Code Online (Sandbox Code Playgroud)