Как контролировать многопоточное применение функции к массиву данных?
- С появлением
tqdm стало проще контролировать процесс прохода по циклу (про tqdm: http://xxtt.ru/60c8)- Также мало для кого секрет, что функции map проста для распараллеливания с помощью встроенной библиотеки
multiprocessing (хорошая статья про это: http://xxtt.ru/c6c6)Но что, если вы хотите следить за процессом распараллеленного выполнения с помощью
multiprocessing?Есть решение! Вот пример:
from multiprocessing import Pool
from tqdm import tqdm_notebook
def pow_2(n):
import time
sq_n = n ** 2
time.sleep(0.1) # slow function 🙂
return (n, sq_n)
def imap_unordered_bar(func, args, n_jobs):
p = Pool(n_jobs)
res_list = [x for x in tqdm_notebook(
p.imap_unordered(func, args),
total=len(args)
)]
p.close()
p.join()
return res_list
result = imap_unordered_bar(pow_2, range(100), n_jobs=10)
где
args - массив данных к которому вы хотите параллельно применить функцию func❗️`imap_unordered` возвращает результаты не обязательно в порядке входных данных. Потому, если вам важно понимать, результатом каких входных значений является выходное значение, возвращайте идентификатор, по которому восстановите к чему относился результат.
Код примера на github: http://xxtt.ru/6b4d