diff options
| author | Scott Gasch <[email protected]> | 2022-06-02 08:23:18 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2022-06-02 08:23:18 -0700 |
| commit | a0722abe80c416e0c174f3ff861566834402d43b (patch) | |
| tree | b80aaff7a143fc7eae3165d4174789a794d72f30 /smart_future.py | |
| parent | 2a6d7810f85b88fb89d11d3e6be64f974ab77f97 (diff) | |
Initial stab at a smarter doc/unit/integration/coverage test runner.
Diffstat (limited to 'smart_future.py')
| -rw-r--r-- | smart_future.py | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/smart_future.py b/smart_future.py index c0fce3a..86f1b1c 100644 --- a/smart_future.py +++ b/smart_future.py @@ -32,6 +32,7 @@ def wait_any( *, callback: Callable = None, log_exceptions: bool = True, + timeout: float = None, ): """Await the completion of any of a collection of SmartFutures and invoke callback each time one completes, repeatedly, until they are @@ -44,6 +45,8 @@ def wait_any( log_exceptions: Should we log (warning + exception) any underlying exceptions raised during future processing or silently ignore then? + timeout: invoke callback with a periodicity of timeout while + awaiting futures """ real_futures = [] @@ -55,18 +58,26 @@ def wait_any( 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: + print("TOP...") + try: + newly_completed_futures = concurrent.futures.as_completed(real_futures, timeout=timeout) + for f in newly_completed_futures: + if callback is not None: + callback() + completed_futures.add(f) + if log_exceptions and not f.cancelled(): + exception = f.exception() + if exception is not None: + logger.warning( + 'Future 0x%x raised an unhandled exception and exited.', id(f) + ) + logger.exception(exception) + raise exception + yield smart_future_by_real_future[f] + except TimeoutError: + print(f"HERE!!! {len(completed_futures)} / {len(real_futures)}.") if callback is not None: callback() - completed_futures.add(f) - if log_exceptions and not f.cancelled(): - exception = f.exception() - if exception is not None: - logger.warning('Future 0x%x raised an unhandled exception and exited.', id(f)) - logger.exception(exception) - raise exception - yield smart_future_by_real_future[f] if callback is not None: callback() |
