Python 3 Selenium多浏览器并行异常:进程启动但函数未正确执行
Selenium多进程执行失败问题解决
问题核心原因
你的代码存在两个关键问题,导致launch_browser函数无法按预期执行:
apply_async的参数传递格式错误- 跨进程传递Selenium Driver对象的设计缺陷
分步修正方案
1. 修正apply_async参数传递格式
pool.apply_async的第二个参数要求是参数元组,直接传入driver会被拆解为多个零散参数(如果driver是可迭代对象),正确写法是将参数打包成元组:
pool.apply_async(launcher.launch_browser, (driver,))
2. 避免跨进程传递Driver对象
Selenium的Driver是和浏览器进程绑定的状态对象,无法在多进程间正确序列化传递。必须在子进程内部创建Driver,而非主进程创建后传入。
调整后的代码示例:
from multiprocessing import Pool import launcher def worker(): # 子进程内部独立创建driver driver = create_driver() # 确保create_driver可在子进程中正常调用 launcher.launch_browser(driver) # 执行完逻辑后关闭driver释放资源 driver.quit() if __name__ == "__main__": pool = Pool(processes=3) # 根据需求指定并发进程数 for _ in range(3): pool.apply_async(worker) # 必须关闭进程池并等待所有子进程执行完成 pool.close() pool.join()
3. 确保主进程等待子进程执行完毕
如果主进程在子进程完成前提前退出,子进程会被强制终止,因此必须调用pool.close()停止接收新任务,再用pool.join()等待所有子进程执行结束。
额外注意事项
- 确保
launch_browser函数内部逻辑不依赖主进程的全局状态,所有资源都在子进程内初始化 - 部分浏览器Driver需要添加特定参数(如Chrome的
--no-sandbox),避免多进程环境下的权限或启动失败问题
内容的提问来源于stack exchange,提问作者jacksc0tt
相关产品推荐
相关产品推荐

