python-3.x Trio:为什么通道被记录为使用`async with`,而不是`with`?

6qftjkof  于 2023-05-19  发布在  Python
关注(0)|答案(1)|浏览(95)

相关文件:https://trio.readthedocs.io/en/latest/reference-core.html#synchronizing-and-communicating-between-tasks
相关编码:https://github.com/python-trio/trio/blob/master/trio/_channel.py
close()文档中,文档提到“使用with receive_channel:将在离开with块时关闭通道对象”。另一方面,文档的以下部分演示了接口专门使用async with receive_channel:,而close()文档使用常规with
根据代码链接,相关类只有__enter____exit__,没有__aenter____aexit__。那么为什么文档中的演示只使用async with呢?如果我在我的代码中使用常规的with,我是否会冒着未来API更改会破坏我的代码的风险?

wixjitnu

wixjitnu1#

这似乎是为了帮助重构,通常是为了通过dependency inversion促进松耦合。
文档中 simple channel 示例中的producerconsumer函数确实分别采用了 arbitrarySendChannelReceiveChannel,而不是专门的内存通道-诚然,由于缺乏类型注解,很难看到:-P
SendChannel/ReceiveChannel对象也实现了AsyncResource接口,因此可以通过调用aclose或使用async with块来关闭它们。
您已经引用过的MemoryReceiveChannel.close文档明确指出
所有通道对象都有一个异步aclose方法。内存通道也可以**同步关闭。

  • (强调我的)*

因此,您可以使用普通的with块和close()方法与内存通道一起使用,没有破坏API更改的风险。但是,如果你想改变或重用你的代码,以使用不同的通道实现,比如DTLSChannel或Web Socket,你会更喜欢使用async with

相关问题