From be7fc89ae9c6a15a86eafb64e3e871ccb5c1e022 Mon Sep 17 00:00:00 2001 From: Guillermo Rodriguez Date: Tue, 18 Mar 2025 13:47:41 -0300 Subject: [PATCH] Add direct ctx managers for RB channels --- tractor/ipc/__init__.py | 4 +++- tractor/ipc/_ringbuf.py | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/tractor/ipc/__init__.py b/tractor/ipc/__init__.py index 689fc44b..4f0cd2b4 100644 --- a/tractor/ipc/__init__.py +++ b/tractor/ipc/__init__.py @@ -55,5 +55,7 @@ if platform.system() == 'Linux': RingBuffBytesSender as RingBuffBytesSender, RingBuffBytesReceiver as RingBuffBytesReceiver, RingBuffChannel as RingBuffChannel, - attach_to_ringbuf_channel as attach_to_ringbuf_channel + attach_to_ringbuf_schannel as attach_to_ringbuf_schannel, + attach_to_ringbuf_rchannel as attach_to_ringbuf_rchannel, + attach_to_ringbuf_channel as attach_to_ringbuf_channel, ) diff --git a/tractor/ipc/_ringbuf.py b/tractor/ipc/_ringbuf.py index 038d9e73..42403937 100644 --- a/tractor/ipc/_ringbuf.py +++ b/tractor/ipc/_ringbuf.py @@ -550,6 +550,36 @@ class RingBuffBytesReceiver(trio.abc.ReceiveChannel[bytes]): await self._receiver.aclose() +@acm +async def attach_to_ringbuf_rchannel( + token: RBToken, + cleanup: bool = True +): + ''' + Attach a RingBuffBytesReceiver from a previously opened + RBToken. + ''' + async with attach_to_ringbuf_receiver( + token, cleanup=cleanup + ) as receiver: + yield RingBuffBytesReceiver(receiver) + + +@acm +async def attach_to_ringbuf_schannel( + token: RBToken, + cleanup: bool = True +): + ''' + Attach a RingBuffBytesSender from a previously opened + RBToken. + ''' + async with attach_to_ringbuf_sender( + token, cleanup=cleanup + ) as sender: + yield RingBuffBytesSender(sender) + + class RingBuffChannel(trio.abc.Channel[bytes]): ''' Combine `RingBuffBytesSender` and `RingBuffBytesReceiver` @@ -588,16 +618,13 @@ async def attach_to_ringbuf_channel( ''' async with ( - attach_to_ringbuf_receiver( + attach_to_ringbuf_rchannel( token_in, cleanup=cleanup_in ) as receiver, - attach_to_ringbuf_sender( + attach_to_ringbuf_schannel( token_out, cleanup=cleanup_out ) as sender, ): - yield RingBuffChannel( - RingBuffBytesSender(sender), - RingBuffBytesReceiver(receiver) - ) + yield RingBuffChannel(sender, receiver)