Python中如何同时运行多个Selenium WebDriver?多进程调用异常排查
问题分析与解决方法
你的核心问题是在主进程中创建的Selenium WebDriver实例无法跨进程传递,这也是enterPoint函数没有执行(无输出)的原因:
- 多进程间是完全隔离的内存空间,WebDriver实例与创建它的进程绑定,且无法被序列化(pickle)后传递给子进程。
- 你在主进程循环创建driver,再通过
apply_async的args传给子进程,这会导致子进程无法正常接收并使用driver,进而函数无法执行。
修正方案
把WebDriver的创建逻辑移到子进程内部,也就是在enterPoint函数里调用setProxy生成driver,而非在主进程创建后传递。同时注意Windows系统下多进程的启动规范(必须用if __name__ == '__main__'包裹主逻辑)。
修改后的代码示例
from multiprocessing import Pool def enterPoint(thread, proxy, accounts): # 子进程内部创建driver driver = setProxy(proxy, thread) print(f'{thread}: I exist!') try: for account in accounts: cEEPE(thread, driver, account) finally: # 确保进程结束时关闭driver,避免残留进程 driver.quit() def main(): pool = Pool() for i in range(len(master)): thread_name = f'Thread#{i+1}' # 传递proxy和账号数据,而非已创建的driver实例 pool.apply_async(enterPoint, args=(thread_name, proxy, master[i])) pool.close() pool.join() if __name__ == '__main__': # 假设master和proxy是你已定义的变量 master = [...] proxy = ... main()
额外说明
- 每个子进程独立创建driver实例,避免进程间资源冲突,符合Selenium的运行逻辑。
- 加入
try...finally块确保driver在任务完成后被正确关闭,防止后台残留chromedriver进程。 - Windows系统下,多进程代码必须放在
if __name__ == '__main__'块中,否则会触发进程重复启动的异常。
内容的提问来源于stack exchange,提问作者Zakaria
相关产品推荐
相关产品推荐

