Ignore late deferred future completion

Alessandro committed May 9, 2026 at 17:36 UTC 30a97cb3f1c5c67113a2b686013e2c4ad02ed36c
1 file changed +15 -3
helpers/defer.py
+15 -3
@@ -1,7 +1,7 @@
1 import asyncio
2 from dataclasses import dataclass
3 import threading
4 -from concurrent.futures import Future
4 +from concurrent.futures import Future, InvalidStateError
5 from typing import Any, Callable, Optional, Coroutine, TypeVar, Awaitable
6
7 T = TypeVar("T")
@@ -194,6 +194,18 @@ class DeferredTask:
194
195 future: Future = Future()
196
197 + def set_result(result: Any) -> None:
198 + try:
199 + future.set_result(result)
200 + except InvalidStateError:
201 + pass
202 +
203 + def set_exception(exception: BaseException) -> None:
204 + try:
205 + future.set_exception(exception)
206 + except InvalidStateError:
207 + pass
208 +
209 async def wrapped():
210 if not self.event_loop_thread.loop:
211 raise RuntimeError("Event loop is not initialized")
@@ -203,11 +215,11 @@ class DeferredTask:
215 while isinstance(result, Awaitable):
216 result = await result
217 self.event_loop_thread.loop.call_soon_threadsafe(
206 - future.set_result, result
218 + set_result, result
219 )
220 except Exception as e:
221 self.event_loop_thread.loop.call_soon_threadsafe(
210 - future.set_exception, e
222 + set_exception, e
223 )
224
225 asyncio.run_coroutine_threadsafe(wrapped(), self.event_loop_thread.loop)