【问题标题】:How to use Multiprocessing with Selenium in Python如何在 Python 中使用多处理和 Selenium
【发布时间】:2018-09-25 04:45:19
【问题描述】:

我正在尝试在 python 中使用 selenium 进行多处理。我的代码如下:

from selenium import webdriver
from multiprocessing import Pool
import xlwings as xw

driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://example.com")

wb = xw.Book('my_file.xlsm')
sht = wb.sheets["Sheet1"]
final_list = []

search = driver.find_element_by_id("ContentPlaceHolder1_txtByName")
for item in search:
       z = item.find_element_by_class_name("valuetext")
       info = z.find_element_by_tag_name("span")
       final_list.append(info.text)

def automate(num):
    col = num
    list_item = final_list[num]   
    sht.range(1, col).value = each


if __name__ == '__main__':

    p = Pool(processes=4)
    data = p.map(automate,range(1,20))        

我遇到的问题是 4 个进程中的每一个都重新打开了网页,我不明白为什么。如果p.map 只针对automate 函数,那么为什么其余代码会针对每个进程运行?

我还是多处理的新手,所以不确定这是否就是它的工作原理。是否有另一种方法可以确保进程只针对函数本身,或者有什么方法可以使用线程?

【问题讨论】:

  • 所有不在函数内的代码都会在你运行脚本时被执行。
  • 另外,您不想与每个进程共享驱动程序的实例。我建议从支持并行性的框架开始,而不是自行开发。

标签: python multithreading selenium python-multiprocessing python-multithreading


【解决方案1】:

multiprocessing docs 的示例中,他们建议将Pool 与上下文管理器一起使用,即,

with Pool(processes=4) as pool: print(pool.map(f, range(10))

这是我在您的使用和文档之间立即看到的最显着的不同。我没有看到它拼写出来,但我会根据你的观察推断,框架在它产生的每个进程中“重新导入”(可以这么说)你的模块,这导致了你报告的行为:即,多个浏览器打开。

为了防止这种情况,我建议将初始化代码放在一个函数中;如果您想共享final_list,您可能应该使用queuemultiprocess 支持的其他数据结构。

【讨论】:

  • 是的,即使使用with 也有相同的效果。我会看看我是否可以通过将它包装在函数中来解决它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多