我已经给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()}")