add
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
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
|
||||
Reference in New Issue
Block a user