在 Trio 中,如果您想将一些数据写入 TCP 套接字,那么显而易见的选择是send_all
:
my_stream = await trio.open_tcp_stream("localhost", 1234)
await my_stream.send_all(b"some data")
请注意,这两者都通过套接字发送该数据并等待它被写入。但是如果你只是想将要发送的数据排队,而不是等待它被写入(至少,你不想在同一个协程中等待)呢?
在 asyncio 中这很简单,因为这两个部分是独立的函数:write()
和drain()
. 例如:
writer.write(data)
await writer.drain()
因此,当然,如果您只想写入数据而不是等待它,您可以直接调用write()
而不等待drain()
。Trio 中是否有等效的功能?我知道这种双功能设计是有争议的,因为它很难正确应用背压,但在我的应用程序中,我需要将它们分开。
现在我已经通过为每个连接创建一个专用的编写器协程并有一个内存通道来将数据发送到该协程来解决它,但是与在调用一个或两个函数之间进行选择相比,它是相当多的faff,而且它似乎是一个有点浪费(大概引擎盖下还有一个发送缓冲区,我的内存通道就像那个缓冲区顶部的缓冲区)。