未对pathos的apipe()返回结果调用get()是否会导致内存占用过高?
关于pathos ThreadPool调用apipe()不调用get()的内存问题结论
这种使用方式一定会导致pathos内部累积状态,最终引发内存占用过高的问题,核心逻辑如下:
apipe()是pathos封装的异步任务提交方法,调用后会立即返回一个ApplyResult对象,作为持有异步任务执行状态、返回结果的占位容器- ThreadPool内部会对所有未完成结果回收的
ApplyResult对象保留强引用,只要你没有主动调用get()拉取结果、也没有完全解除对返回对象的所有引用,对应任务的执行结果、状态元数据就会一直驻留在内存中,哪怕任务本身已经执行结束也不会被主动清理 - 如果你是批量调用
apipe()后将所有返回的ApplyResult存储到了列表、字典等容器中长期持有,哪怕你永远不调用get(),这部分内存也会持续累积,任务量足够大时会直接触发内存溢出
可行的优化方案
- 如果你不需要获取异步任务的执行结果,调用
apipe()时不要持有返回的ApplyResult对象,等对象超出作用域后Python垃圾回收机制会自动清理对应的内部状态 - 如果必须持有任务对象,不管你是否需要返回值,都尽量在任务执行完成后调用一次
get(),调用后ThreadPool会自动清理对应任务的所有残留状态 - 批量提交大量任务的场景下,可以分批提交、分批调用
get()回收结果,避免同一时间内存中堆积太多未处理的任务状态
内容的提问来源于stack exchange,提问作者Michael Ray Lovett
相关产品推荐
相关产品推荐

