python ProcessPoolExecutor

Рейтинг: 0Ответов: 1Опубликовано: 28.01.2023

У меня есть класс, парсер, который нужно запустить в многопроцессорности. Я использую ProcessPoolExecutor() модуля concurrent.futures и в цикле передаю в класс парсера категорию и запускаю парсер. Все работает в стольких процессах, сколько я указал в max_workers (допустим 4). Но по истечению какого то времени, я замечаю, что работает всего 1 процесс. В диспетчере задач висят 4 процесса, но работает только 1.

Я не знаю, как отслеживать правильно, но приделал enumerate и этот номер так же передаю в парсер, который выводит принт номер категории из парсера по завершении парсинга. И по началу все нормально, 1, 2, 3, 4 запустились одновременно и все идет ок. 3 категория допустим спарсилась быстрее 1,2,4. Значит должен взять 5 категорию и парсить. И так далее. Работая в 4 процесса каждая категория. А у меня получается так, что стартуют одновременно, грубо говоря час работают одновременно, а потом остается 1 рабочий процесс, который парсит категории по очередно.

with pool.ProcessPoolExecutor(max_workers=4) as executor:
    for num, categories in enumerate(categories_all):
        parser = Parsers(categories=categories, count_category=num)
        executor.submit(parser.run)

Ответы

▲ 1Принят

В парсере, который вызывается метод executor.submit(parser.run) было написано еще многопоточность ThreadPoolExecutor. А в документации написано, что если в вызываемом executor объекте будет еще вызван executor, то это приведет к взаимоблокировке. Исправил, проблем с этим теперь нет.