我一直在尝试编写一个为神经网络创建数据集的脚本。这需要我在CPU上运行一次耗时的计算,然后在GPU上进行快速计算。为了提高性能,我想在CPU上并行运行该步骤,并且由于资源方面的限制,我只能在GPU上运行一个线程。因此,我用两个ThreadPoolExecutor
进行了设置,它们映射到输入并使用tqdm
来跟踪进度。
我现在面临的问题是,tqdm
的进度条仅在大约一半的计算完成后才会显示,而我完全不明白为什么会这样。在下面,您将看到一个再现此行为的代码片段。
import time
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor
exec1 = ThreadPoolExecutor(max_workers=2)
exec2 = ThreadPoolExecutor(max_workers=1)
list(tqdm(exec2.map(lambda _: time.sleep(1),exec1.map(lambda _: time.sleep(2),range(20))),total=20))
仅使用一个ThreadPoolExecutor
时,进度条将按预期工作:
list(tqdm(exec1.map(lambda _: time.sleep(2),range(20)),total=20))
有人知道什么可能导致这种行为吗?
编辑:我做了一些测试,发现由exec2.map
创建的集合仅在大多数条目已经生成之后才被更新。比较的动作会立即执行。