#python #multithreading #concurrent.futures
Вопрос:
Основная цель: Я хотел бы просмотреть N путей на одном веб-сайте. Я также хотел бы сделать это на T-м количестве потоков.
Пример, который я могу успешно запустить, — это выполнение 10 путей с 10 потоками или 10 потоков с 5 потоками каждый раз. Проблема с последним заключается в том, что он открывает 5 браузеров chrome, а затем открывает еще 5 браузеров chrome.
В идеале я хотел бы иметь 5 браузеров chrome (T потоков), в каждом из которых есть список идентификаторов для просмотра.
В коде, который я привел ниже, он успешно проходит через индекс[0] каждого списка. Однако как только он переходит к следующему элементу, он перестает работать.
Например, он будет запускать идентификаторы путей 1, 2, 3, 4, 5. Но он остановится на пути/идентификаторе=6, 7, 8, 9, 10.
Функция:
import concurrent.futures
def pathCrawler(idList):
DRIVER_PATH = 'chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
path = 'fake.../id='
for id in idList:
print('start')
driver.get(path str(id))
# Try Hitting #1 Button
try:
# XPath for #1 Button
driver.find_element(By.XPATH, '').click()
print(f'{id}: success 1')
#Try Hitting #2 Button
try:
# XPath for #2 Button
driver.find_element(By.XPATH, '').click()
print(f'{id}: success 2')
except:
print(f'{id} = Exception 2')
except:
print(f'Exception 1')
print('end')
return f'Done with {idList}'
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
df = [[1,6] , [2,7] , [3,8] , [4,9] , [5,10]]
results = executor.map(pathCrawler, df)
У кого-нибудь есть какие-нибудь предложения?
Спасибо,
Комментарии:
1. Код, который вы там показываете
driver.get
, выходит ЗА рамки цикла for. Это действительно то, что у тебя есть? Если это так, тоid
это встроенная функция, а не идентификационный номер. В любом случае, я уверен, что вы хотитеdriver.get
попасть внутрь петли.2. Спасибо! Это опечатка с моей стороны при редактировании для переполнения стека. Я это исправлю. В коде, который я использую, есть драйвер.войдите в цикл. У меня есть два оператора печати в начале и в конце цикла for. Для веб-страниц 1,2,3,4,5. Они напечатают «начало» и «конец», но на страницах 6,7,8,9,10 будет напечатано только «начало».
3. Выяснив проблему, в начале у меня была проверка, которая блокировала поток.
Ответ №1:
Выяснив проблему, в начале у меня была проверка, которая блокировала поток.