Python:仅等待当前正在运行的`concurrent.futures.ThreadPoolExecutor`的未来

时间:2019-05-08 06:49:48

标签: multithreading python-3.6

我已经给concurrent.futures.ThreadPoolExecutor提供了很多任务,并且在退出应用程序之前,我只想等待当前运行的将来。我该如何做,而不必保存所有期货并等待等待呢? (我要对执行人采取行动。)

注意:这与Python: Wait on all of `concurrent.futures.ThreadPoolExecutor`'s futures不同,因为用户想在那里全部等待,但是在这里我只想等待当前运行的未来并杀死所有未决的未来。

注意:请参见下面的示例,其中我正在运行三个任务(每个任务ping回送)。因为max_workers = 1,所以每个任务最终都按顺序运行。在退出我的应用程序之前,我要致电shutdown。如果我调用shutdown(wait=False),则我的应用程序将在终止应用程序时终止所有正在进行的任务。

如果我调用shutdown(wait=True),那么我的应用程序将在杀死应用程序后等待所有任务。

但是我真的只想等待正在执行的任务,并在杀死我的应用程序后杀死所有未决/未启动的任务。

def run_background_task(callable_task, *callable_task_args):
    """Runs a task (function) in background and immediately returns None
    """
    loop = asyncio.get_event_loop()
    f = loop.run_in_executor(executor, callable_task, *callable_task_args)
    # asyncio.ensure_future is used for scheduling a future task
    asyncio.ensure_future(f)
    return executor


def subprocess_task(ping_ip, i):
    cmd = f"/bin/ping 127.0.0.{ping_ip} -c {i*2}"
    print(f"Running task {cmd}")
    proc = subprocess.Popen(cmd, shell=True, stdout=sys.stderr)
    print(f"subprocess for task {ping_ip}: {proc.pid}")
    proc.communicate()


def signal_handler(*args, **kwargs):
    print(f"Handled signal: {args}, {kwargs} {executor}")
    executor.shutdown(wait=False)
    raise Exception("Exiting out")


def main():
    catchable_sigs = set(signal.Signals) - {signal.SIGKILL, signal.SIGSTOP}
    for sig in catchable_sigs:
        signal.signal(sig, signal_handler)
    run_background_task(subprocess_task, 1, 15)
    run_background_task(subprocess_task, 2, 30)
    run_background_task(subprocess_task, 3, 45)


main()
print(f"Started Job {os.getpid()}")

0 个答案:

没有答案