File tree Expand file tree Collapse file tree 2 files changed +56
-0
lines changed Expand file tree Collapse file tree 2 files changed +56
-0
lines changed Original file line number Diff line number Diff line change 1+ import trio
2+
3+
4+ __all__ = ["wait_for_any_event" ]
5+
6+
7+ # Based on https://trio.readthedocs.io/en/stable/reference-core.html#custom-supervisors
8+
9+
10+ async def jockey (event : trio .Event , cancel_scope : trio .CancelScope ) -> None :
11+ await event .wait ()
12+ cancel_scope .cancel ()
13+
14+
15+ async def wait_for_any_event (* events : trio .Event ) -> None :
16+ """
17+ Wait for any of the given events to be set.
18+
19+ Args:
20+ *events: The events to wait for.
21+
22+ """
23+ if not events :
24+ raise ValueError ("no events provided" )
25+
26+ async with trio .open_nursery () as nursery :
27+ for event in events :
28+ nursery .start_soon (jockey , event , nursery .cancel_scope )
Original file line number Diff line number Diff line change 1+ import trio .testing
2+
3+ from websockets .trio .utils import *
4+
5+ from .utils import IsolatedTrioTestCase
6+
7+
8+ class UtilsTests (IsolatedTrioTestCase ):
9+ async def test_wait_for_any_event (self ):
10+ event1 = trio .Event ()
11+ event2 = trio .Event ()
12+ done = trio .Event ()
13+
14+ async def waiter ():
15+ await wait_for_any_event (event1 , event2 )
16+ done .set ()
17+
18+ self .nursery .start_soon (waiter )
19+ await trio .testing .wait_all_tasks_blocked ()
20+ self .assertFalse (done .is_set ())
21+
22+ event1 .set ()
23+ await trio .testing .wait_all_tasks_blocked ()
24+ self .assertTrue (done .is_set ())
25+
26+ async def test_wait_for_any_event_no_events (self ):
27+ with self .assertRaises (ValueError ):
28+ await wait_for_any_event ()
You can’t perform that action at this time.
0 commit comments