【问题标题】:Purpose of asyncio.wait_for()asyncio.wait_for() 的目的
【发布时间】:2017-12-26 12:13:21
【问题描述】:

据我了解,在协程中从协程中让出将线程控制传递给事件循环。

然后事件循环在其他协程(其中,yield from 的协程)之间进行某种调度,并且在某个时刻,调用 yield from 的协程将被恢复。

这与将协程包装在 ansyncio.wait_for 调用中并从后一个调用中产生有何不同?

【问题讨论】:

    标签: python-3.4 python-asyncio coroutine


    【解决方案1】:

    wait_for 增加了超时。例如,从网络检索数据的时间太长(让我们用异步睡眠来模拟它)更糟糕的是,您最终可能只会出现错误。

    @coroutine
    def fetch_data():
        yield from asyncio.sleep(100000)
        raise Exception('No data')
    

    那么普通的 yield 会等待 100000 秒,用户什么也得不到

    data = yield from fetch_data() 
    

    另一方面,wait_for 增加了时间限制:

    data = yield from wait_for(fetch_data(), 5)
    

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

    wait_for 是普通情况的实现,没什么特别的。

    更新async/await

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

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

    如果你想在有时间限制的情况下等待它:

    data = await asyncio.wait_for(fetch_data(), 5)
    

    【讨论】:

    • 这真的很有意义。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多