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

多线程永久执行Selenium任务时遭遇MaxRetryError连接拒绝问题求助

解决Selenium多线程无限循环下的Connection Refused错误

看起来你遇到的是典型的Selenium驱动资源泄漏问题,多线程+无限循环反复创建销毁driver的场景很容易触发这个问题,我来帮你拆解原因和解决办法:

错误本质分析

你看到的MaxRetryError + Connection refused,本质是系统里残留了大量未彻底销毁的ChromeDriver(或对应浏览器驱动)进程。这些进程占用了端口和系统资源,导致新的driver实例无法建立连接。

虽然你用了try-finally确保quit()执行,但有时候因为页面加载卡死、线程上下文异常,quit()可能没有彻底终止驱动进程——比如浏览器进程已经崩溃,但driver进程还在后台挂着,积累到一定数量就会出现连接失败。

具体解决方案

1. 强制清理残留进程,确保资源释放

在finally块里,除了调用driver.quit(),还要主动杀掉可能残留的驱动/浏览器进程。比如在Linux环境下,可以用os.system或subprocess执行命令清理:

import os
from selenium.common.exceptions import WebDriverException

def your_function():
    driver = None
    try:
        driver = webdriver.Chrome()  # 初始化driver
        # 遍历列表加载页面的逻辑
        for item in your_list:
            driver.get(item)
            # 其他业务操作
    except Exception as e:
        print(f"操作出错: {e}")
    finally:
        if driver:
            try:
                driver.quit()
            except WebDriverException:
                pass  # 忽略quit时的异常
            # 强制杀掉残留的ChromeDriver进程(Linux示例)
            os.system("pkill -f chromedriver")
            # 如果Chrome浏览器进程也残留,也可以一起清理
            os.system("pkill -f chrome")
        # 无限循环执行
        while True:
            # 重复你的业务逻辑

注意:Windows环境下可以用taskkill /F /IM chromedriver.exe和taskkill /F /IM chrome.exe,要根据你的操作系统调整命令。

2. 复用Driver实例,减少创建销毁次数

每次循环都创建新driver是非常耗资源的做法,完全可以把driver初始化放到while True循环外面,整个线程生命周期只创建一次driver,循环里只做页面遍历:

def your_function():
    driver = None
    try:
        driver = webdriver.Chrome()
        while True:
            try:
                # 遍历列表加载页面
                for item in your_list:
                    driver.get(item)
                    # 其他业务操作
            except Exception as e:
                print(f"循环内出错: {e}")
                # 可以在这里刷新driver或者重新加载页面,而非销毁整个driver
                driver.refresh()
    except Exception as e:
        print(f"Driver初始化出错: {e}")
    finally:
        if driver:
            try:
                driver.quit()
                os.system("pkill -f chromedriver")
            except:
                pass

重点:多线程环境下,每个线程必须有独立的driver实例,绝对不能多个线程共享同一个driver——Selenium的driver不是线程安全的,共享会导致各种诡异问题。

3. 添加初始化失败的重试机制

当遇到连接拒绝错误时,先清理残留进程,再重试初始化:

from selenium.common.exceptions import WebDriverException
import time

def init_driver():
    max_retries = 3
    for _ in range(max_retries):
        try:
            # 先清理残留进程
            os.system("pkill -f chromedriver")
            time.sleep(2)
            return webdriver.Chrome()
        except (WebDriverException, MaxRetryError) as e:
            print(f"Driver初始化失败,重试中: {e}")
            time.sleep(3)
    raise Exception("多次尝试后仍无法初始化Driver")

def your_function():
    while True:
        driver = None
        try:
            driver = init_driver()
            # 遍历列表的业务逻辑
            for item in your_list:
                driver.get(item)
        except Exception as e:
            print(f"出错: {e}")
        finally:
            if driver:
                try:
                    driver.quit()
                except:
                    pass
            os.system("pkill -f chromedriver")
        time.sleep(1)  # 循环间隔,避免过于频繁创建资源

额外注意事项

  • 定期检查系统进程:用ps aux | grep chromedriver(Linux)或任务管理器(Windows)看看是不是有大量残留进程,如果有,说明你的清理逻辑还没到位。
  • 调整浏览器启动参数:可以给driver添加一些参数减少资源占用,比如--headless=new(无头模式)、--disable-gpu、--no-sandbox等,降低进程崩溃的概率。
  • 避免长时间运行单个driver:如果业务必须频繁切换环境,也可以设置一个循环次数,比如每跑10次循环就销毁driver重新创建,避免单个driver内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:47:45