Playwright Python上下文崩溃引发全局崩溃循环问题求助
问题场景
部署3个浏览器实例,运行最多160个asyncio任务,任务与40个浏览器上下文在浏览器间平均分配。调用page.goto()时偶尔触发**「Connection closed while reading from the driver」**错误,且该错误会导致所有其他上下文同步失效。执行清理操作时仍会出现驱动错误:
2023-07-01 15:51:01,967 pipe closed by peer or os.write(pipe, data) raised exception. 2023-07-01 15:51:01,968 Connection closed while reading from the driver
重启工作流后,再次访问相同URL会陷入相同错误的崩溃循环;更换URL则可正常运行(但后续再次访问原URL也可能恢复正常,说明并非特定URL导致问题)。首次报错的堆栈跟踪如下:
2023-07-01 15:50:57,535 Connection closed while reading from the driver Traceback (most recent call last): File "/home/uvloop_reload/reloadtraffic-python/exe.py", line 105, in worker await page.goto( File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/async_api/_generated.py", line 9204, in goto await self._impl_obj.goto( File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/_impl/_page.py", line 495, in goto return await self._main_frame.goto(**locals_to_params(locals())) File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/_impl/_frame.py", line 147, in goto await self._channel.send("goto", locals_to_params(locals())) File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/_impl/_connection.py", line 61, in send return await self._connection.wrap_api_call( File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/_impl/_connection.py", line 461, in wrap_api_call return await cb() File "/home/uvloop_reload/venv-uv/lib/python3.10/site-packages/playwright/_impl/_connection.py", line 96, in inner_send result = next(iter(done)).result() Exception: Connection closed while reading from the driver
排查思路
1. 资源过载检查
- 查看服务器CPU、内存、网络IO在报错时的状态:单浏览器承载约13个上下文、每个上下文绑定4个任务,若CPU使用率接近100%、内存不足触发OOM、网络带宽被占满,系统可能强制终止Playwright驱动或浏览器进程,导致通信管道中断。
- 检查系统日志(如
dmesg、syslog),确认是否存在浏览器进程被OOM Killer杀死的记录。
2. 进程通信问题排查
- 监控浏览器进程存活状态:报错中的
pipe closed by peer提示管道被对方关闭,大概率是浏览器进程意外崩溃。在代码中添加PID监控逻辑,报错时检查对应浏览器PID是否仍存活。 - 降低并发量测试:将任务数减半至80、上下文数量减半,观察是否还会触发错误。若错误消失,说明当前并发量超出环境承载或Playwright的稳定阈值。
3. 代码逻辑检查
- 上下文/页面生命周期管理:排查是否存在重复使用已关闭的上下文、页面的情况;任务报错后是否未正确关闭页面/上下文,导致资源泄漏。
page.goto()参数设置:确认是否配置了合理的timeout值,是否启用wait_until参数(如domcontentloaded)避免等待过久触发异常。- 任务调度逻辑:验证是否存在多个任务同时操作同一个上下文/页面的情况,确保调度逻辑严格隔离上下文与任务的绑定关系。
4. 版本兼容性排查
- 查找Playwright已知Bug:在GitHub Issues中搜索
Connection closed while reading from the driver,查看是否有类似问题的修复记录,若使用旧版本直接升级至最新稳定版。 - 同步浏览器与驱动版本:运行
playwright install --with-deps,确保浏览器与驱动版本匹配,避免兼容性问题。
解决建议
- 添加资源监控:在代码中嵌入CPU、内存、磁盘IO的监控逻辑,报错时记录当前资源状态,便于定位瓶颈。
- 实现错误隔离与重试:为每个任务添加独立异常捕获,单个上下文/页面出错时立即关闭并重建,避免影响其他任务;给
page.goto()添加重试机制,重试前重建页面。 - 优化并发策略:限制单浏览器实例承载的上下文数量(如最多10个),每个上下文仅绑定1个任务,减少资源竞争与冲突。
- 升级Playwright:将Playwright升级至最新稳定版,修复已知的进程通信类Bug。
- 启用调试日志:运行时设置
PWDEBUG=1或在代码中将日志级别调至DEBUG,记录详细的驱动通信日志,定位管道关闭的具体环节。
内容的提问来源于stack exchange,提问作者Never Mind
相关产品推荐
相关产品推荐

