我有一个多线程函数,我想要一个使用tqdm的状态栏。有没有一种用ThreadPoolExecutor显示状态栏的简单方法?让我感到困惑的是并行化部分。
import concurrent.futures
def f(x):
return f**2
my_iter = range(1000000)
def run(f,my_iter):
with concurrent.futures.ThreadPoolExecutor() as executor:
function = list(executor.map(f, my_iter))
return results
run(f, my_iter) # wrap tqdr around this function?发布于 2020-09-11 01:28:26
可接受答案的问题在于,ThreadPoolExecutor.map函数必须生成结果,而不是按照可用的顺序生成结果。因此,如果myfunc的第一次调用碰巧是最后一次完成,那么只有当所有调用都完成时,进度条才会立即从0%变为100%。在as_completed中使用ThreadPoolExecutor.submit会更好
import time
import concurrent.futures
from tqdm import tqdm
def f(x):
time.sleep(0.001) # to visualize the progress
return x**2
def run(f, my_iter):
l = len(my_iter)
with tqdm(total=l) as pbar:
# let's give it some more threads:
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
futures = {executor.submit(f, arg): arg for arg in my_iter}
results = {}
for future in concurrent.futures.as_completed(futures):
arg = futures[future]
results[arg] = future.result()
pbar.update(1)
print(321, results[321])
my_iter = range(100000)
run(f, my_iter)打印:
321 103041这只是个大概的想法。根据my_iter的类型,可能无法直接将len函数直接应用于它,而不首先将其转换为列表。要点是在as_completed中使用submit。
https://stackoverflow.com/questions/51601756
复制相似问题