Python-pipepipe висит с многопроцессорной обработкой

Я пытаюсь запустить boilerpipe с помощью Python multiprocessing. Выполнение этого для анализа RSS-каналов из нескольких источников. Проблема в том, что он зависает в одном из потоков после обработки некоторых ссылок. Весь поток работает, если я удаляю пул и запускаю его в цикле.

Вот мой многопроцессорный код:

proc_pool = Pool(processes=4)
for each_link in data:
    proc_pool.apply_async(process_link_for_feeds, args=(each_link, ), callback=store_results_to_db)
proc_pool.close()
proc_pool.join()

Это мой код boilerpipe, который вызывается внутри process_link_for_feeds():

def parse_using_bp(in_url):
    extracted_html = ""
    if ContentParser.url_skip_p.match(in_url):
        return extracted_html
    try:
        extractor = Extractor(extractor='ArticleExtractor', url=in_url)
        extracted_html = extractor.getHTML()
        del extractor
    except BaseException as e:
        print "Something wrong at Boilerpipe -->", in_url, "-->", e
        extracted_html = ""
    finally:
        return extracted_html

Я не знаю, почему он висит. Что-то не так в коде proc_pool?

Ответ 1

Можете ли вы попробовать потоки? Многопроцессорность в основном используется, когда вы связаны с ЦП. Кроме того, котел-труба уже включает защиту при использовании потоковой передачи, которая предполагает, что также может потребоваться защита при многопроцессорной обработке.

Если вам действительно нужна mp, я постараюсь выяснить, как исправлять котел.

Вот что, я думаю, будет заменой замены, используя потоки. Он использует multiprocessing.pool.ThreadPool(который представляет собой "поддельный" многопроцессорный пул). Единственное изменение - от Pool(..) до multiprocessing.pool.ThreadPool(...). Проблема заключается в том, что я не уверен, что тест многопоточности котла будет определять пул потоков() как имеющий activeCount() > 1.

import multiprocessing
from multiprocessing.pool import ThreadPool  # hidden ThreadPool class

# ...
proc_pool = ThreadPool(processes=4)  # this is the only difference
for each_link in data:
    proc_pool.apply_async(process_link_for_feeds, args=(each_link, ), callback=store_results_to_db)
proc_pool.close()
proc_pool.join()