11import asyncio
2+ import contextlib
23import enum
34from enum import Enum
45from typing import Any
@@ -110,11 +111,22 @@ async def _send_msg_to_reducer(msg: bytes, writer: asyncio.StreamWriter):
110111 await writer .drain ()
111112
112113
114+ async def _clean_up_task (task : asyncio .Task | None ) -> None :
115+ if task is None :
116+ return
117+ if not task .done ():
118+ task .cancel ()
119+ with contextlib .suppress (asyncio .CancelledError , asyncio .IncompleteReadError ):
120+ await task
121+
122+
113123async def handle_reducer_connection (
114124 reader : asyncio .StreamReader ,
115125 writer : asyncio .StreamWriter ,
116126 reducer_connection_queue : asyncio .Queue ,
117127):
128+ recv_listener_msg_task : asyncio .Task | None = None
129+ recv_reducer_msg_task : asyncio .Task | None = None
118130 try :
119131 message_bytes = await _recv_msg_from_reducer (reader )
120132 if message_bytes is None :
@@ -138,10 +150,8 @@ async def handle_reducer_connection(
138150 # Transition to next state
139151 """
140152 current_wait_state : _ReducerHandlerWaitState = _ReducerHandlerWaitState .JOB_CONFIG
141- recv_listener_msg_task : asyncio .Task | None = asyncio .create_task (
142- msg_queues .get_from_listeners ()
143- )
144- recv_reducer_msg_task : asyncio .Task | None = asyncio .create_task (reader .readexactly (1 ))
153+ recv_listener_msg_task = asyncio .create_task (msg_queues .get_from_listeners ())
154+ recv_reducer_msg_task = asyncio .create_task (reader .readexactly (1 ))
145155 while True :
146156 pending = [recv_listener_msg_task , recv_reducer_msg_task ]
147157 done , pending = await asyncio .wait (pending , return_when = asyncio .FIRST_COMPLETED )
@@ -225,5 +235,7 @@ async def handle_reducer_connection(
225235 await msg_queues .put_to_listeners (msg )
226236 break
227237 finally :
238+ await _clean_up_task (recv_listener_msg_task )
239+ await _clean_up_task (recv_reducer_msg_task )
228240 writer .close ()
229241 await writer .wait_closed ()
0 commit comments