如何使用 `concurrent.futures.ProcessPoolExecutor` 取消长 运行 子进程 运行?
How to cancel long-running subprocesses running using `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."
不幸的是,当操作超时时,该进程仍然是 运行,即使未来已被取消。我如何取消 process/task 以便它真正停止 运行?
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())
您可以看到完整的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."
不幸的是,当操作超时时,该进程仍然是 运行,即使未来已被取消。我如何取消 process/task 以便它真正停止 运行?
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())