37 lines
956 B
Python
37 lines
956 B
Python
import trio
|
|
|
|
|
|
__all__ = ["race_events"]
|
|
|
|
|
|
# Based on https://trio.readthedocs.io/en/stable/reference-core.html#custom-supervisors
|
|
|
|
|
|
async def jockey(event: trio.Event, cancel_scope: trio.CancelScope) -> None:
|
|
await event.wait()
|
|
cancel_scope.cancel()
|
|
|
|
|
|
async def race_events(*events: trio.Event) -> None:
|
|
"""
|
|
Wait for any of the given events to be set.
|
|
|
|
Args:
|
|
*events: The events to wait for.
|
|
|
|
"""
|
|
if not events:
|
|
raise ValueError("no events provided")
|
|
|
|
try:
|
|
async with trio.open_nursery() as nursery:
|
|
for event in events:
|
|
nursery.start_soon(jockey, event, nursery.cancel_scope)
|
|
except BaseExceptionGroup as exc:
|
|
try:
|
|
trio._util.raise_single_exception_from_group(exc)
|
|
except trio._util.MultipleExceptionError:
|
|
raise AssertionError(
|
|
"race_events should be canceled; please file a bug report"
|
|
) from exc
|