首页 > 解决方案 > Python asyncio:我什么时候应该调用 wait_closed()?

问题描述

我正在尝试了解 的目的asyncio.StreamWriter.wait_closed,以及它如何通过asyncio.wait_forvia与取消交互asyncio.TimeoutError

例如,如果我想确保在我的程序由于超时而退出之前关闭套接字,我是否需要wait_closed在子句中调用:finally

async def do_network_stuff():  
    (r,w) = await asyncio.open_connection(...)
    try:
        await w.write(b'some data')
    finally:
        # I think I need this, and that it can't be cancelled by TimeoutError.
        w.close()
        # But do I need this? And can it be cancelled by TimeoutError?
        await w.wait_closed()

asyncio.run(asyncio.wait_for(do_network_stuff(), timeout=10))

如果答案是“是”,那么我是否需要换wait_closedshield以避免它被取消?即,finally 子句是否应该如下所示:

    finally:
        w.close()
        await asyncio.shield(w.wait_closed())

我看到在trio框架中,相应的流闭包函数trio.abc.AsyncResource.aclose包括一些内置的屏蔽/屏蔽,即使被取消,它也会关闭套接字,但是 asyncio 文档在这一点上没有提供任何帮助。

标签: pythonpython-asyncio

解决方案


推荐阅读