Как вынести функцию из многопоточности?
У меня есть вот такой код
if os.path.exists(term2label_path):
with open(term2label_path) as f:
term2label = json.load(f)
else:
term2label = {}
with multiprocessing.Pool(job_count) as pool:
mined_jsons = pool.map(mine_pdf, ((p, for_train) for p in doc_paths))
dataset_last_labeled_page = max(chain(
[0],
(page_index for _, page_index in mined_jsons if page_index)
))
LOG.info(f'Last labeled page index in dataset is'
f' {dataset_last_labeled_page}')
if for_train:
pool.map(create_labeled_tokens,
((path, term2label, dataset_last_labeled_page)
for path, last_labeled_page in mined_jsons
if last_labeled_page is not None))
store_parents_children_to_model(parents_children_dir, model_dir)
else:
pool.map(create_text,
(path for path, last_labeled_page in mined_jsons))
В этом коде есть функция create_labeled_tokens Эта функция выполняется в режиме многопоточности.
Я хочу чтобы все функции выполнялись в режиме многопоточости, но create_labeled_tokens выполнялась в одном потоке.
Для общего понимания, результатом работы каждой из функций есть сохранение я дерикторию.
Как мне вынести эту функцию из многопточности? Буду благодарен за любые советы Спасибо
Ответы (2 шт):
Самое простое - заменить pool.map на просто map, вернее на list(map(...)), потому что map делает генератор (map - это скорее аналог pool.imap), а он "ленивый", его нужно проитерировать, чтобы он выполнился:
if for_train:
list(map(create_labeled_tokens,
((path, term2label, dataset_last_labeled_page)
for path, last_labeled_page in mined_jsons
if last_labeled_page is not None)))
По идее, будет всё тоже самое, только в одном процессе.
И, на всякий случай: мультипроцессность и многопоточность - это не одно и то же, хотя штуки и похожие, лучше их всё-таки уметь различать.
Для вызова функции в асихронном режиме (выполнение в одном рабочем процессе пула) при мультипроцессном режиме (вижу его в коде) используют метод apply_async.
Советую посмотреть на примеры применения по поиску "apply_async" в документации: https://python.readthedocs.io/en/stable/library/multiprocessing.html?highlight=multiprocessing%20pool#module-multiprocessing.pool