#python #multiprocessing
#питон #многопроцессорная обработка
Вопрос:
У меня есть проблема с процессами python, действительно, у меня есть следующая функция:
def line_processing(i: int, df: pd.DataFrame, df_score: pd.DataFrame, sheet_id: str, sheet_score_id: str, folder_texte: str, folder_guide_id: str): print('get_text_boilerpipe : ' str(i)) call_get_text_boilerpipe(df.url[i], df, i, folder_texte) print('post_yourtextguru_guide : ' str(i)) call_post_yourtextguru_guide(df.keyword[i], df, i) print('get_yourtextguru_guide : ' str(i)) call_get_yourtextguru_guide(df.guide_id[i], df, i, folder_guide_id) print('post_yourtextguru_score : ' str(i)) call_post_yourtextguru_score(df.guide_id[i], df.extract_text[i], df, df_score, i) print('write_sheet : ' str(i)) write_sheet(sheet_id, df) write_sheet(sheet_score_id, df_score)
Функция работает правильно, но когда я пытаюсь включить ее в процесс, с :
p = Process(target=line_processing, args=(4, df_complete, df_score, sheet_complete, sheet_score, folder_texte, folder_guide_id,)) p.start() p.join()
Он выполняет только первую функцию и никогда не переходит к следующим
get_text_boilerpipe : 4
Вот пример одной из моих функций, все они имеют одинаковую форму:
def get_text_boilerpipe(url: str) -gt; str: extractor = Extractor(extractor='ArticleExtractor', url=url) return extractor.getText() def call_get_text_boilerpipe(url: str, df: pd.DataFrame, i: int, parent_id: str): if df.status[i] in ('TEXT_FAIL', 'NaN'): try: content = get_text_boilerpipe(url) if content: if len(str(content)) lt; 50000: doc_id = create_texte_googledoc(df.keyword[i], parent_id, str(content)) df.texte_doc_url[i] = 'https://docs.google.com/document/d/' str(doc_id) df.extract_text[i] = str(content) df.status[i] = 'TEXT_OK' df.log[i] = np.nan else: df.status[i] = 'TEXT_FAIL' df.log[i] = 'Texte récupéré trop gros (gt;50000 caractères)' else: df.status[i] = 'TEXT_FAIL' df.log[i] = 'Aucun contenu extrait de l'url' except: e = sys.exc_info()[0] df.status[i] = 'TEXT_FAIL' df.log[i] = "Error: %s" % e return 0
Знаете ли вы, почему он никогда не переходит к следующей функции в процессе? Я сделал что-то не так? Спасибо!
Комментарии:
1. Может быть, я что-то упускаю, но: пока вы активно не переносите результаты из порожденного/разветвленного процесса обратно в ведущий процесс, они исчезают. Существуют различные способы сделать это, используя каналы, очереди, запись на диск, использование pool.map вместо отдельных процессов и т. Д.