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

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

Войти через центр авторизации
Похожие вопросы