Исправлен скачок нескольких индикаторов выполнения (tqdm) в многопроцессорной среде Python - PullRequest
1 голос
/ 19 июня 2019

Я хочу распараллелить задачу (progresser()) для диапазона входных параметров (L). Ход каждой задачи должен контролироваться отдельным индикатором выполнения в терминале. Я использую пакет tqdm для индикаторов выполнения. Следующий код работает на моем Mac до 23 индикаторов выполнения (L = list(range(23)) и ниже), но производит хаотическое скачок индикаторов выполнения, начиная с L = list(range(24)). У кого-нибудь есть идеи как это исправить?

from time import sleep
import random
from tqdm import tqdm
from multiprocessing import Pool, freeze_support, RLock

L = list(range(24)) # works until 23, breaks starting at 24

def progresser(n):
    text = f'#{n}'

    sampling_counts = 10
    with tqdm(total=sampling_counts, desc=text, position=n+1) as pbar:
        for i in range(sampling_counts):
            sleep(random.uniform(0, 1))
            pbar.update(1)

if __name__ == '__main__':
    freeze_support()

    p = Pool(processes=None,
                initargs=(RLock(),), initializer=tqdm.set_lock
                )
    p.map(progresser, L)
    print('\n' * (len(L) + 1))

В качестве примера того, как это должно выглядеть в целом, ниже приведен скриншот для L = list(range(16)).

multiprocessing progess bars

версии: python==3.7.3, tqdm==4.32.1

...