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

Selenium多线程运行异常求助:多线程启动后自动退出

问题原因及解决方案

核心问题分析

  1. 全局变量共享冲突:ChromeMetamask.web是全局共享的函数属性,多线程同时调用时会互相覆盖浏览器实例,一个线程执行quit()后,其他线程的驱动会直接失效,触发异常导致程序退出。
  2. 线程参数传递错误:创建线程时args={x}传递的是集合类型,而run函数需要接收单个整数参数,类型不匹配会触发未捕获异常,直接终止线程。
  3. WebDriver非线程安全:Selenium的WebDriver实例本身不支持多线程共享,每个线程必须拥有独立的浏览器驱动实例。

修复后的完整代码

from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium import webdriver
import random
import threading

def ChromeMetamask():
    options = ChromeOptions()
    options.add_extension("metaMaskextension.crx")
    # 每个调用返回独立的浏览器驱动实例,不再使用全局共享属性
    return webdriver.Chrome(options=options)

def StreamTeam(driver):
    # 接收当前线程的驱动实例,操作完成后关闭
    ...
    driver.quit()

def CreateWallet(driver):
    # 接收当前线程的驱动实例,避免全局依赖
    ...

def run(x):
    print("Running thread", x)
    sleep(x)
    while True:
        driver = None
        try:
            driver = ChromeMetamask()
            print("Creating wallet of thread", x)
            CreateWallet(driver)
            print("Working on thread", x)
            StreamTeam(driver)
            print(f"Thread {x} has completed")
            # 任务完成后可退出循环,按需调整是否持续运行
            break
        except Exception as e:
            print(f"Thread {x} encounters an error: {str(e)}, restarting")
            # 异常时确保关闭当前线程的驱动,避免资源泄漏
            if driver:
                try:
                    driver.quit()
                except:
                    pass
            continue

if __name__ == "__main__":
    thread_count = int(input("Enter number of threads: "))
    threads = []
    for x in range(1, thread_count + 1):
        # 修正参数传递为元组格式,确保线程函数能正确接收参数
        threads.append(threading.Thread(target=run, args=(x,)))
    for t in threads:
        t.start()
    for t in threads:
        t.join()

关键修复点说明

  • 移除全局共享驱动:ChromeMetamask直接返回新的驱动实例,每个线程持有独立的浏览器对象,彻底避免线程间干扰。
  • 驱动实例透传:CreateWallet、StreamTeam都接收当前线程的驱动作为参数,确保操作的是自身线程的浏览器。
  • 修正参数传递:将args={x}改为args=(x,),传递正确的元组类型参数,解决参数不匹配的异常问题。
  • 异常资源清理:在run的异常处理块中,确保出错时关闭当前线程的驱动,防止浏览器进程泄漏。
  • 可选循环控制:如果任务不需要无限重启,完成后可通过break退出循环,根据实际需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:45:32