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)