python - Python asyncio:我什么时候应该调用 wait_closed()?
问题描述
我正在尝试了解 的目的asyncio.StreamWriter.wait_closed
,以及它如何通过asyncio.wait_for
via与取消交互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_closed
行shield
以避免它被取消?即,finally 子句是否应该如下所示:
finally:
w.close()
await asyncio.shield(w.wait_closed())
我看到在trio
框架中,相应的流闭包函数trio.abc.AsyncResource.aclose
包括一些内置的屏蔽/屏蔽,即使被取消,它也会关闭套接字,但是 asyncio 文档在这一点上没有提供任何帮助。
解决方案
推荐阅读
- sql - 在 Microsoft Access 的 VBA 中使用 SQL 中的 Dlookup 导致未知错误
- sql - 加快不同计数的 activerecord 查询
- tcl - Tcl / Expect 由名称管道块/缓冲区驱动的脚本意外输出
- java - 使用 HashMap 比较两个不同类型的列表
- math - 确定基于用户位置的经纬度
- command-line - ImageMagick 使用 alpha 通道来控制计算最小、最大和平均图像值
- spark-java - 请求的路由尚未在 Spark 中映射为 Accept
- c# - 我将如何计算winform中剩余的时间?
- xamarin.forms - Xamarin Forms Grid 条件 RowSpan
- ruby - 如何将连接字符串与 sequel 一起用于 postgresql