在使用ProcessPoolExecutor的同时使用asyncio时,容易出现task未执行完毕便调用ProcessPoolExecutor的shutdown导致程序意外退出的问题。
解决方法是使用asyncio的asyncio.wait方法,等待所有task执行完毕后再调用ProcessPoolExecutor的shutdown。代码示例如下:
import asyncio
import concurrent.futures
async def run_in_executor(executor):
return await asyncio.get_event_loop().run_in_executor(executor, some_blocking_io)
async def main():
loop = asyncio.get_event_loop()
executor = concurrent.futures.ProcessPoolExecutor()
tasks = [loop.create_task(run_in_executor(executor)) for _ in range(5)]
await asyncio.wait(tasks)
executor.shutdown(wait=True)
if __name__ == '__main__':
asyncio.run(main())
下一篇:Asyncio无法关闭会话