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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:45:17