-def wait_any(futures: List[SmartFuture], *, callback: Callable = None):
- finished: Mapping[int, bool] = {}
- x = 0
- while True:
- future = futures[x]
- if not finished.get(future.get_id(), False):
- if future.is_ready():
- finished[future.get_id()] = True
- yield future
- else:
- if callback is not None:
- callback()
- time.sleep(0.1)
- x += 1
- if x >= len(futures):
- x = 0
- if len(finished) == len(futures):
+def wait_any(
+ futures: List[SmartFuture],
+ *,
+ callback: Callable = None,
+ log_exceptions: bool = True,
+):
+ real_futures = []
+ smart_future_by_real_future = {}
+ completed_futures: Set[fut.Future] = set()
+ for x in futures:
+ assert isinstance(x, SmartFuture)
+ real_futures.append(x.wrapped_future)
+ smart_future_by_real_future[x.wrapped_future] = x
+
+ while len(completed_futures) != len(real_futures):
+ newly_completed_futures = concurrent.futures.as_completed(real_futures)
+ for f in newly_completed_futures: