Задать вопрос
Tungsteniac
@Tungsteniac
Инженер-сварщик.

Как повторно использовать экземпляр yandexdriver в новом потоке?

from multiprocessing.pool import ThreadPool
Весь код приводить не буду. Инициировал 3 экземпляра yandexdriver'а при помощи самопальной функци stock_of_drivers и сохранил их в переменную sod.
sod = stock_of_drivers(3)
Создал вместилище для 3 потоков.
pool = ThreadPool(processes=3)
Создал 3 потока, где get_content - парсер, chunk - список строк для внесения в диалоговое окно обрабатываемой страницы.
async_result0 = pool.apply_async(get_content, (chunk[0], sod['driver0']))
async_result1 = pool.apply_async(get_content, (chunk[1], sod['driver1']))
async_result2 = pool.apply_async(get_content, (chunk[2], sod['driver2']))

При первом проходе парсинг идет в три потока, но на следующей итерации, если driver'а заново не создать (предыдущие закрыть разумеется), то случится MaxRetryError. Если заново driver'а создавать, то накладные расходы анулируют всю выгоду мультипоточности, и даже замедляют в сравнении с однопоточной реализацией. Как быть?
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
Tungsteniac
@Tungsteniac Автор вопроса
Инженер-сварщик.
Понял! В парсинг-функции get_content удалил везде driver.quit(), останавливаю driver снаружи. Теперь все работает, и довольно быстро. Пока причесываю код, допиливаю, но даже с тремя потоками ускорение заметно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы