Не получается реализовать многопроцессорное выполнение программы

Объясните пожалуйста как реализовать многопроцессорное выполнение программы в этом коде:

class RelatedQuestionParser(Browser):

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

    def __init__(self):

        self.url = 'link'
        self.browser = self.get_browser()    # Получаем браузер
        self.launch_browser(self.url)        # Открываем браузер
        self.page = self.convert_to_bs()     # Создаем объект BeautifulSoup
        self.parsing_process()               # Начинаем парсить


    def convert_to_bs(self):

        """ Получаем объект BeautifulSoup """

        html_source = self.browser.page_source
        page = BeautifulSoup(html_source, 'lxml')

        return page


    def parsing_process(self):

        """ Процесс парсинга """

        def get_related_questions():

            """ Получить все похожие вопросы """

            related_questions = self.page.find('div', {'class': 'sidebar-related'}) \
                .find_all('div', {'class': 'spacer'})


            return related_questions


        def get_question_information(question):

            """ Забираем всю нужную информацию с вопроса """

            vote_related_q = question.find('a').find('div').text
            text_related_q = question.find_all('a')[-1].text
            link_related_q = question.find_all('a')[-1]['href']

            done_text_related = html_trans.translate_text(text_related_q)


        related_questions = get_related_questions()    # Все похожие вопросы



a = RelatedQuestionParser()

Я делал так, но появляется ошибка AttributeError: Can't pickle local object 'RelatedQuestionParser.parsing_process.<locals>.get_question_information':

        # Код выше такой же как в первом примере
        ...
        related_questions = get_related_questions()    # Все похожие вопросы

        with multiprocessing.Pool(5) as pool:

            pool.map(get_question_information, related_questions) # Возвращает ошибку


Ответы (1 шт):

Автор решения: asanisimov

Вам просто следует вынести логику multiprocessing на верхний уровень. Внутри себя пул при распаковке повторно ипортирует переданную функцию, для передачи рабочим процессам. Для этого функция должна быть на верхнем уровне, а не внутри класса.

class RelatedQuestionParser(Browser):

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

    def __init__(self):

        self.url = 'link'
        self.browser = self.get_browser()    # Получаем браузер
        self.launch_browser(self.url)        # Открываем браузер
        self.page = self.convert_to_bs()     # Создаем объект BeautifulSoup
        self.parsing_process()               # Начинаем парсить


    def convert_to_bs(self):

        """ Получаем объект BeautifulSoup """

        html_source = self.browser.page_source
        page = BeautifulSoup(html_source, 'lxml')

        return page

    def get_related_questions(self):

        """ Получить все похожие вопросы """

        related_questions = self.page.find('div', {'class': 'sidebar-related'}) 
            .find_all('div', {'class': 'spacer'})


        return related_questions


def get_question_information(question):
    """ Забираем всю нужную информацию с вопроса """

    vote_related_q = question.find('a').find('div').text
    text_related_q = question.find_all('a')[-1].text
    link_related_q = question.find_all('a')[-1]['href']

    done_text_related = html_trans.translate_text(text_related_q)

if __name__ == '__main__':
    a = RelatedQuestionParser()
    related_questions = a.get_related_questions()

    with multiprocessing.Pool(5) as pool:
        pool.map(get_question_information, related_questions)
    
→ Ссылка