Сопоставление списка с concurrent.futures завершает задачу раньше? — Питон

#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:

Выяснив проблему, в начале у меня была проверка, которая блокировала поток.