python - 修复python多处理中多个进度条(tqdm)的跳转
问题描述
我想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))
下面提供了一个屏幕截图。
版本:python==3.7.3
,tqdm==4.32.1
解决方案
当我将大小设置为 30 时,我没有任何跳跃。也许你有更多的处理器并且可以有更多的工人在运行。
但是,如果 n 变大,由于块大小的性质,您将开始看到跳跃。
即
p.map
会将您的输入分成块大小并给每个进程一个块。所以随着n
变大,你的块大小也会变大,你的.......是的position
(pos = n + 1)!
注意:虽然 map 保留了返回结果的顺序。它计算的顺序是任意的。
随着n
越来越大,我建议使用处理器 ID 作为查看每个进程的进度的位置。
from time import sleep
import random
from tqdm import tqdm
from multiprocessing import Pool, freeze_support, RLock
from multiprocessing import current_process
def progresser(n):
text = f'#{n}'
sampling_counts = 10
current = current_process()
pos = current._identity[0]-1
with tqdm(total=sampling_counts, desc=text, position=pos) as pbar:
for i in range(sampling_counts):
sleep(random.uniform(0, 1))
pbar.update(1)
if __name__ == '__main__':
freeze_support()
L = list(range(30)) # works until 23, breaks starting at 24
# p = Pool(processes=None,
# initargs=(RLock(),), initializer=tqdm.set_lock
# )
with Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),)) as p:
p.map(progresser, L)
print('\n' * (len(L) + 1))
推荐阅读
- javascript - 等到内部承诺解决后再返回
- c++ - c++中的通用函数持有者
- r - GLM:警告消息:“newdata”有 16623 行,但找到的变量有 22488 行
- sql-server - MS SQL Server 从列中提取整数,递增 1 并将数字加载回列
- angular - 如何让 Angular Material Icon 在我的 Angular 应用程序中显示轮廓?
- elasticsearch - 使用不同的分析器为字符串列表指定多字段
- c# - TA-Lib : 技术分析库、回顾和不稳定期
- python - 在Django中,对于同一类的两个对象之间的OneToOne关系,可以防止对象在db级别引用自身吗?
- html - 即使在放大后如何将子内容放入父 div 中
- authentication - NuxtJs - 无法读取未定义的属性“标题”