Не получается реализовать многопроцессорное выполнение программы
Объясните пожалуйста как реализовать многопроцессорное выполнение программы в этом коде:
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)