@@ -122,7 +122,7 @@ class Session:
122122 seq : int # Last sent sequence number
123123
124124 # Terminating
125- _terminating_task : asyncio .Task [None ]
125+ _terminating_task : asyncio .Task [None ] | None
126126
127127 def __init__ (
128128 self ,
@@ -165,6 +165,9 @@ def __init__(
165165 self .ack = 0
166166 self .seq = 0
167167
168+ # Terminating
169+ self ._terminating_task = None
170+
168171 self ._start_heartbeat ()
169172 self ._start_serve_responses ()
170173 self ._start_close_session_checker ()
@@ -192,10 +195,12 @@ async def ensure_connected[HandshakeMetadata](
192195 return
193196
194197 def do_close () -> None :
195- # We can't just call self.close() directly because
196- # we're inside a thread that will eventually be awaited
197- # during the cleanup procedure.
198- self ._terminating_task = asyncio .create_task (self .close ())
198+ # Avoid closing twice
199+ if self ._terminating_task is None :
200+ # We can't just call self.close() directly because
201+ # we're inside a thread that will eventually be awaited
202+ # during the cleanup procedure.
203+ self ._terminating_task = asyncio .create_task (self .close ())
199204
200205 if not self ._connecting_task :
201206 self ._connecting_task = asyncio .create_task (
@@ -566,10 +571,12 @@ async def block_until_connected() -> None:
566571
567572 def _start_close_session_checker (self ) -> None :
568573 def do_close () -> None :
574+ # Avoid closing twice
575+ if self ._terminating_task is None :
569576 # We can't just call self.close() directly because
570577 # we're inside a thread that will eventually be awaited
571578 # during the cleanup procedure.
572- self ._terminating_task = asyncio .create_task (self .close ())
579+ self ._terminating_task = asyncio .create_task (self .close ())
573580
574581 self ._task_manager .create_task (
575582 _check_to_close_session (
0 commit comments