python - 异步执行器在运行后不会终止进程
问题描述
我想在一个主要是异步 I/O 应用程序中拥有一个进程池,因为有时需要完成 CPU 绑定的任务,而这不应该让主应用程序停顿。此外,我想限制进程的数量。
根据文档,正确的方法是使用run_in_executor
. 下面的代码有效,但在工作完成后它不会终止进程。
import asyncio
from concurrent.futures.process import ProcessPoolExecutor
class App:
def __init__(self):
self.process_pool = ProcessPoolExecutor(4)
self.loop = asyncio.get_event_loop()
async def get_regular(self):
return await regular()
async def get_expensive(self):
return await self.loop.run_in_executor(
self.process_pool, expensive
)
您如何重用进程池中的进程或终止它们以遵守上限?
解决方案
如果你重用它,进程池会有奇怪的行为。因此,我建议每次都创建一个新池并将其包装在示例with
中所示的结构中。
如果您坚持重复使用池,那么管理其生命周期的责任就落在了您的肩上。使用后,可以通过以下方式杀死池中的所有子进程
self.process_pool.shutdown()
推荐阅读
- linux - 致命错误:kdecoration.h:没有这样的文件或目录
- asp.net-core-mvc - 想要一个通用的 EnterpriseLibrary for .NET Core MVC(通用数据库文件)
- go - 切片索引奇怪的边缘情况
- javascript - 基于另一个对象的值访问对象的属性
- scala - 带有 postfixOps 的 Scala 映射
- javascript - 在 React 中为嵌套组件导出 Hooks?
- batch-file - 用于启动新 javaw 进程的批处理文件未按预期工作
- go - 如何在golang的x509证书中解码复合自定义扩展?使用当前代码错误是:asn1:结构错误:序列标签不匹配
- python - 通过 netfilter 钩子修改后的 Tcp 虚假重传
- python - 如何使 GTKOverlay 不会将所有交互从小部件中带走?