Source code for council.runners.parallel
from concurrent import futures
from .runner_context import RunnerContext
from .runner_base import RunnerBase
from .runner_executor import RunnerExecutor
[docs]class Parallel(RunnerBase):
"""
Runner that execution multiple :class:`.RunnerBase` in parallel
"""
def __init__(self, *runners: RunnerBase):
self.runners = runners
def _run(
self,
context: RunnerContext,
executor: RunnerExecutor,
) -> None:
contexts = [(runner, context.fork()) for runner in self.runners]
# Seems like it is a bad idea using lambda as the function in submit,
# which results into inconsistent invocation (wrong arguments)
fs = [executor.submit(runner.run, inner, executor) for (runner, inner) in contexts]
try:
dones, not_dones = futures.wait(fs, context.budget.remaining().duration, futures.FIRST_EXCEPTION)
self.rethrow_if_exception(dones)
finally:
context.merge([context for (_, context) in contexts])
[f.cancel() for f in fs]