2.8 KiB
Trio patterns: tractor.trionics
Sugary structured concurrency (SC) patterns for plain trio code — no actor runtime required. These helpers grew out of real distributed-system needs in tractor apps but every one of them works in a single-process program too; import via from tractor import trionics.
tractor.trionics
Context-manager helpers
gather_contexts
maybe_open_context
maybe_open_nursery
Note
gather_contexts is "a nursery for async context managers": it enters N acms concurrently and yields their values in input order. maybe_open_context is the actor-wide cache/multiplex layer on top — the first task pays the acm setup cost, later callers get (cache_hit=True, ...) and share the same value until all users exit.
Broadcast fan-out
broadcast_receiver
BroadcastReceiver
Lagged
BroadcastReceiveError
A single-producer, many-consumer broadcast layer over any trio-style receive channel: non-lossy for the fastest consumer while slower consumers raise Lagged (a trio.TooSlowError subtype) once they fall behind the internal ring. This is exactly the machinery behind tractor.MsgStream.subscribe — see examples/streaming_broadcast_fanout.py.
If the shared underlying receiver raises an ordinary exception, the subscriber which owned that receive gets the original failure. Waiting peers drain their retained values and then raise BroadcastReceiveError, with the original failure available as __cause__. Later subscribers observe the same terminal state without retrying the failed underlying receiver.
ExceptionGroup helpers
collapse_eg
maybe_raise_from_masking_exc
Note
collapse_eg "un-nests" single-exception ExceptionGroup wrappers from strict-eg trio nurseries so your except clauses match the original error; maybe_raise_from_masking_exc surfaces real errors that would otherwise be masked by trio.Cancelled during teardown.