|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 兰竹皋 于 2020-11-16 11:33 编辑
读者好,这个很奇怪的问题,如下代码,可以正常运行:
- from multiprocessing.pool import ThreadPool
- import time
- def progress_bar(total, ncols=10, desc='Processing', unit='it'):
- def get_bar(l, n, ncol):
- r = ncol - l - 1
- bar = ''.join(['#' for i in range(l)])
- if l != ncol:
- bar += f'{n}'
- bar += ''.join([' ' for i in range(r)])
- return '|'+bar+'|'
- processing = f'{0:>3d}%'
- bar = get_bar(0, 0, ncols)
- mod = f'{desc}: {bar} {processing:>4s}'
- print('\r'+mod, end='')
- for i in range(total):
- start_time = time.time()
- # 内容处理
- time.sleep(0.1)
- stop_time = time.time()
- delta_time = stop_time - start_time
- temp = (i+1)/total
- processing = f'{int(temp*100):>3d}%'
- l = int(temp*ncols)
- n = int(temp*ncols*10)%10
- bar = get_bar(l, n, ncols)
- mod = f'{desc}: {bar} {processing:>4s} {1/delta_time:.2f}it/s'
- print('\r'+mod, end='')
- print('\n', end='')
- def main():
- print('main start')
- pool = ThreadPool(5)
- for i in range(5):
- pool.apply_async(progress_bar, (100,50))
- time.sleep(1)
- pool.close()
- pool.join()
- print('main over')
- main()
复制代码
结果:
但在改了progress函数最下方mod字符串后,就不能运行了。。。。为什么?没有报错,就是循环没有运行。。。
- from multiprocessing.pool import ThreadPool
- import time
- def progress_bar(total, ncols=10, desc='Processing', unit='it'):
- def get_bar(l, n, ncol):
- r = ncol - l - 1
- bar = ''.join(['#' for i in range(l)])
- if l != ncol:
- bar += f'{n}'
- bar += ''.join([' ' for i in range(r)])
- return '|'+bar+'|'
- processing = f'{0:>3d}%'
- bar = get_bar(0, 0, ncols)
- mod = f'{desc}: {bar} {processing:>4s}'
- print('\r'+mod, end='')
-
- start_time = time.time()
-
- for i in range(total):
- sub_start_time = time.time()
- # 内容处理
- time.sleep(0.1)
- sub_stop_time = time.time()
- sub_delta_time = sub_stop_time - sub_start_time
- delta_time = sub_stop_time - start_time
- remain_time = (total - i - 1)*sub_delta_time
-
- temp = (i+1)/total
- processing = f'{int(temp*100):>3d}%'
- l = int(temp*ncols)
- n = int(temp*ncols*10)%10
- bar = get_bar(l, n, ncols)
- mod = f'{desc}: {bar} {processing:>4s} [{delta_time//60:0>2d}:{delta_time%60:0>2d}<{remain_time//60:0>2d}:{remain_time%60:0>2d}, {1/sub_delta_time:.2f}it/s]'
- print('\r'+mod, end='')
- print('\n', end='')
- def main():
- print('main start')
- pool = ThreadPool(5)
- for i in range(5):
- pool.apply_async(progress_bar, (100,50))
- time.sleep(1)
- pool.close()
- pool.join()
- print('main over')
- main()
复制代码
结果:
希望得到解惑,谢谢。。。
本帖最后由 gonff 于 2020-11-18 19:06 编辑
试了一下,主要原因有两个:
其一是remain_time和sub_delta_time都没有定义;(如果你其他语句里定义了,那就没这个问题)
其二是d不支持浮点型。例如
>>> f'{0.1:>2d}'
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
f'{0.1:>2d}'
ValueError: Unknown format code 'd' for object of type 'float'
>>> f'{0.1:>.2f}'
'0.10'
这两个错误导致,for i in range(total)内语句每次执行到mod这里就跳出。不会显示。最终显示的只有初始化用的那个进度条。
我改成了这样:
mod = f'{desc}: {bar} {processing:>4s} [{delta_time//60:.2f}<{delta_time%60:>.2f}{1/delta_time:.2f}it/s]'
可以显示。你可以再改一下变成你需要的。
另外如果你要求整数的话就int作用一下
{int(delta_time//60):>2d}
|
|