Задать вопрос
@HexUserHex

Ошибка в логике многопоточного парсера?

Приветствую,
пробую написать многопоточный парсер на python, на текущий момент если честно даже не уверен что выбранный мною модуль threading является именно тем что мне нужно на самом деле, буду благодарен за совет или помощь более опытных разработчиков.

Цель:
Запустить парсинг с заранее установленным количеством потоков, и поддерживать заданное количество потоков на всем протяжении выполнения скрипта. В качестве примера я планирую парсить данные с ресурса где id инкрементируется.

Сильно упрощенный пример:
import threading
import time

def hard_func(i):
        print("very big code")
        return 1

if __name__ == "__main__":

    max_thread = 4
    threads = list()
    start_time = time.perf_counter()


    for i in range(0, 100000):
        print('Threads: ', str(threading.active_count()), ' i: ', str(i))
    
        if threading.active_count() < max_thread:
            print("Сreate and start thread %d.", i)
            x = threading.Thread(target=hard_func, args=(i,))
            threads.append(x)
            x.start()

    for index, thread in enumerate(threads):
        thread.join()

    end_time = time.perf_counter()
    elapsed_time = end_time - start_time
    print("Elapsed time: ", elapsed_time)


На данный момент скрипт выполняется быстрее с одним потоком чем с 2я и более.
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@ArtemiiZ
Можно попробовать multiprocessing.
Из-за ограничений GIL, threading, по факту, на процессоре выполняется всё равно по очереди. Лучшее его применение - это использование для запросов к внешнему источнику, и не дожидаясь ответа он сразу начинает новый процесс.
Ответ написан
Ваш ответ на вопрос

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

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