本文介绍了如何取消使用`concurrent.futures.ProcessPoolExecutor`运行的长运行子流程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您可以查看完整的here

我的代码的简化版本如下:

executor = ProcessPoolExecutor(10)
try:
    coro = bot.loop.run_in_executor(executor, processUserInput, userInput)
    result = await asyncio.wait_for(coro, timeout=10.0, loop=bot.loop)
except asyncio.TimeoutError:
    result="Operation took longer than 10 seconds. Aborted."
不幸的是,当操作超时时,即使将来已取消,该进程仍在运行。如何取消该进程/任务,使其实际停止运行?

推荐答案

ProcessPoolExecutor使用multiprocessing模块。建议使用multiprocessing.Event来允许您的子流程正常退出,而不是取消事件,因为它不会.terminate()子流程:

import asyncio
import multiprocessing
import time
from concurrent.futures.process import ProcessPoolExecutor


def f(done):
    print("hi")

    while not done.is_set():
        time.sleep(1)
        print(".")

    print("bye")

    return 12345


async def main():
    done = manager.Event()
    fut = loop.run_in_executor(None, f, done)
    print("waiting...")
    try:
        result = await asyncio.wait_for(asyncio.shield(fut), timeout=3)
    except asyncio.TimeoutError:
        print("timeout, exiting")
        done.set()
        result = await fut
    print("got", result)

loop = asyncio.get_event_loop()
loop.set_default_executor(ProcessPoolExecutor())
manager = multiprocessing.Manager()

loop.run_until_complete(main())

这篇关于如何取消使用`concurrent.futures.ProcessPoolExecutor`运行的长运行子流程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 10:01
查看更多