相关文件: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更改会破坏我的代码的风险?
1条答案
按热度按时间wixjitnu1#
这似乎是为了帮助重构,通常是为了通过dependency inversion促进松耦合。
文档中 simple channel 示例中的
producer
和consumer
函数确实分别采用了 arbitrarySendChannel
和ReceiveChannel
,而不是专门的内存通道-诚然,由于缺乏类型注解,很难看到:-PSendChannel
/ReceiveChannel
对象也实现了AsyncResource
接口,因此可以通过调用aclose
或使用async with
块来关闭它们。您已经引用过的
MemoryReceiveChannel.close
文档明确指出所有通道对象都有一个异步
aclose
方法。内存通道也可以**同步关闭。因此,您可以使用普通的
with
块和close()
方法与内存通道一起使用,没有破坏API更改的风险。但是,如果你想改变或重用你的代码,以使用不同的通道实现,比如DTLSChannel
或Web Socket,你会更喜欢使用async with
。