You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python异步+多进程场景下反复出现GetOverlappedResult err 109的原因排查

问题原因及解决方案

首先,GetOverlappedResult got err 109本质是Windows系统错误码ERROR_BROKEN_PIPE,表示通信管道被意外断开,这个问题和你结合异步IO与多进程的资源清理逻辑直接相关:

核心原因

你的代码中使用了multiprocessing.Manager、Barrier和跨进程队列(TileQueue),这些组件依赖Windows底层的命名管道/匿名管道实现进程间通信。当工作进程完成任务退出时,主进程的异步事件循环尚未完成相关通信资源的清理,或者工作进程被被动终止而非主动退出,导致管道连接被强制切断,触发Windows IO子系统返回这个错误。

由于你设置了WORKER_COUNT个工作进程,每个进程退出时都会触发一次管道断开的错误提示,所以会出现对应次数的报错。

可行的解决办法

  • 让工作进程主动退出:在所有任务处理完成后,向TileQueue中发送WORKER_COUNT个结束信号(比如None),每个工作进程收到信号后主动调用sys.exit()或正常返回,避免被动终止。
  • 正确清理Manager资源:主进程在退出前,先调用manager.shutdown()显式关闭multiprocessing.Manager的后台服务进程,再等待所有工作进程join完成,确保通信管道被正常关闭。
  • 规范进程启动逻辑:Windows下多进程必须使用spawn启动方式,确保代码包裹在if __name__ == '__main__':块中,避免子进程重复初始化异步循环或共享资源。
  • 异步循环的优雅退出:主进程的异步循环要通过asyncio.run()或显式调用loop.close()完成优雅退出,不要强制终止事件循环。

内容的提问来源于stack exchange,提问作者pepoluan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:01:02