@zlodiak

Как использовать потоки не последовательно?

Написал небольшой парсер с использованием модуля threadings. Проблема в том, что в моём случае многопоточность не уменьшает время работы скрипта.

Как видите, у меня после запуска очередного потока скрипт ждёт его завершения и только потом переходит к запуску следующего потока. Подскажите пожалуйста как исправить это.

import requests
from bs4 import BeautifulSoup
import threading


personal_pages_paths = []
domain = 'https://vk.com'
search_host = 'https://vk.com/people/'
lastnames = [
    'Иванов',
    'Петров',
    'Сидоров',
    'Козлов',
    'Смирнов',
    'Михайлов',
    'Соколов',
    'Кузнецов',
    'Попов',
    'Лебедев',
    'Волков',
    'Морозов',
    'Новиков',
]


def get_personal_page_paths(html_text):
    paths = []
    soup = BeautifulSoup(html_text, 'lxml')
    link_obj = soup.find('div', {'class': 'results'}).find_all('a', {'class': 'search_item'})

    for path in link_obj:
        paths.append(path['href'])

    return paths


def recieve_page_html(lastname_page):
    with requests.Session() as session:
        html = session.get(lastname_page)
        lastname_paths = get_personal_page_paths(html.text)
        personal_pages_paths.extend(lastname_paths)


def main():
    for lastname in lastnames:
        lastname_page = search_host + lastname
        lastname_paths = []
        paths = threading.Thread(target=recieve_page_html, args=(lastname_page,))
        paths.start()
        paths.join()

    print('PATHS:', personal_pages_paths)
    print('\n LENGTH: ', len(personal_pages_paths))


if __name__ == "__main__":
    main()
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@RivalCode
Нужно с начало все потоки запустить, а уже потом в отдельном цикле join, для этого потоки можно собрать в список:
workers = []
for lastname in lastnames:
        lastname_page = search_host + lastname
        lastname_paths = []
        paths = threading.Thread(target=recieve_page_html, args=(lastname_page,))
        paths.start()
        workers.append(paths)
for w in workers:
        w.join()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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