Как использовать многопроцессорность с Selenium в Python - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь использовать многопроцессорность с использованием селена в Python.Мой код выглядит следующим образом:

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, то почему остальная часть кода выполняется для каждого процесса?

Я все еще новичок в многопроцессорности, поэтому не уверен, что так оно и есть.Есть ли другой способ сделать это, чтобы гарантировать, что процессы нацелены только на саму функцию, или есть способ, которым я мог бы использовать многопоточность?

1 Ответ

0 голосов
/ 25 сентября 2018

В примерах в многопроцессорных документах они предлагают использовать Pool с менеджером контекста, т. Е.

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

НаиболееЯ сразу вижу разницу между вашим использованием и документами.Я не вижу, как это прописано, но на основании ваших наблюдений я бы сделал вывод, что фреймворк «реимпортирует» (так сказать) ваш модуль в каждый процесс, который он породил, и это приводит к поведению, о котором вы сообщаете: а именно:открытие нескольких браузеров.

Чтобы предотвратить это, я бы рекомендовал поместить код инициализации в функцию;если вы хотите поделиться final_list, вам, вероятно, следует сделать это с queue или другой структурой данных, поддерживаемой multiprocess.

...