Selenium多线程运行异常求助:多线程启动后自动退出
问题原因及解决方案
核心问题分析
- 全局变量共享冲突:
ChromeMetamask.web是全局共享的函数属性,多线程同时调用时会互相覆盖浏览器实例,一个线程执行quit()后,其他线程的驱动会直接失效,触发异常导致程序退出。 - 线程参数传递错误:创建线程时
args={x}传递的是集合类型,而run函数需要接收单个整数参数,类型不匹配会触发未捕获异常,直接终止线程。 - 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
相关产品推荐
相关产品推荐

