我的TQDM进度条在多线程进程期间不会显示,我只能在进程完成后才能看到它
这里有一个重现这个问题的方法
我编写了这两个方法
from concurrent.futures import ProcessPoolExecutor
import sys
from colorama import Fore
def parallelize(desc, func, array, max_workers):
with ProcessPoolExecutor(max_workers=max_workers) as executor:
output_data = list(progress_bar(desc, list(executor.map(func,array))))
return output_data
def progress_bar(desc, array):
return tqdm(array,
total=len(array),
file=sys.stdout,
ascii=' >',
desc=desc,
bar_format="%s{l_bar}%s{bar:30}%s{r_bar}" % (Fore.RESET, Fore.BLUE, Fore.RESET))
你可以这样测试它
from tqdm import tqdm
test = range(int(1e4))
def identity(x):
return x
parallelize("", identity, test, 2)
它应该打印这个(00:00),但这个过程大约需要3sc
100%|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>| 10000/10000 [00:00<00:00, 3954279.25it/s]
谢谢你的帮助
发布于 2021-07-25 07:40:49
我想这是因为当你调用进度条的时候
output_data = list(progress_bar(desc, list(executor.map(func,array))))
python首先执行executor.map(func, array)
,然后才将结果传递给progress_bar
。这将不会是相同的,但我可以与你分享如何并行化python函数的样板。
from joblib import Parallel, delayed
def func(a):
# Do something
# Parallelize the call
Parallel(n_jobs=-1)(delayed(func)(a) for a in tqdm(array, total=len(array))
发布于 2021-07-25 08:00:35
替换了这个方法,它起作用了。
def parallelize(desc, func, array, max_workers):
return Parallel(n_jobs=max_workers)(delayed(func)(a) for a in progress_bar(desc, array))
https://stackoverflow.com/questions/68514221
复制相似问题