鱼C论坛

 找回密码
 立即注册
查看: 2006|回复: 3

[已解决]求助,好奇怪的,关于多线程中循环不执行问题。。。

[复制链接]
发表于 2020-11-15 23:40:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 兰竹皋 于 2020-11-16 11:33 编辑


读者好,这个很奇怪的问题,如下代码,可以正常运行:
  1. from multiprocessing.pool import ThreadPool
  2. import time

  3. def progress_bar(total, ncols=10, desc='Processing', unit='it'):
  4.     def get_bar(l, n, ncol):
  5.         r = ncol - l - 1
  6.         bar = ''.join(['#' for i in range(l)])
  7.         if l != ncol:
  8.             bar += f'{n}'
  9.         bar += ''.join([' ' for i in range(r)])
  10.         return '|'+bar+'|'

  11.     processing = f'{0:>3d}%'
  12.     bar = get_bar(0, 0, ncols)
  13.     mod = f'{desc}:  {bar} {processing:>4s}'
  14.     print('\r'+mod, end='')

  15.     for i in range(total):
  16.         start_time = time.time()
  17.         # 内容处理
  18.         time.sleep(0.1)

  19.         stop_time = time.time()
  20.         delta_time = stop_time - start_time

  21.         temp = (i+1)/total
  22.         processing = f'{int(temp*100):>3d}%'
  23.         l = int(temp*ncols)
  24.         n = int(temp*ncols*10)%10
  25.         bar = get_bar(l, n, ncols)
  26.         mod = f'{desc}:  {bar} {processing:>4s}  {1/delta_time:.2f}it/s'
  27.         print('\r'+mod, end='')

  28.     print('\n', end='')


  29. def main():
  30.     print('main start')
  31.     pool = ThreadPool(5)
  32.     for i in range(5):
  33.         pool.apply_async(progress_bar, (100,50))
  34.         time.sleep(1)
  35.     pool.close()
  36.     pool.join()
  37.     print('main over')

  38. main()
复制代码

结果:
1.png

但在改了progress函数最下方mod字符串后,就不能运行了。。。。为什么?没有报错,就是循环没有运行。。。
  1. from multiprocessing.pool import ThreadPool
  2. import time

  3. def progress_bar(total, ncols=10, desc='Processing', unit='it'):
  4.     def get_bar(l, n, ncol):
  5.         r = ncol - l - 1
  6.         bar = ''.join(['#' for i in range(l)])
  7.         if l != ncol:
  8.             bar += f'{n}'
  9.         bar += ''.join([' ' for i in range(r)])
  10.         return '|'+bar+'|'

  11.     processing = f'{0:>3d}%'
  12.     bar = get_bar(0, 0, ncols)
  13.     mod = f'{desc}:  {bar} {processing:>4s}'
  14.     print('\r'+mod, end='')
  15.    
  16.     start_time = time.time()
  17.    
  18.     for i in range(total):
  19.         sub_start_time = time.time()
  20.         # 内容处理
  21.         time.sleep(0.1)

  22.         sub_stop_time = time.time()
  23.         sub_delta_time = sub_stop_time - sub_start_time
  24.         delta_time = sub_stop_time - start_time
  25.         remain_time = (total - i - 1)*sub_delta_time
  26.         
  27.         temp = (i+1)/total
  28.         processing = f'{int(temp*100):>3d}%'
  29.         l = int(temp*ncols)
  30.         n = int(temp*ncols*10)%10
  31.         bar = get_bar(l, n, ncols)
  32.         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]'
  33.         print('\r'+mod, end='')

  34.     print('\n', end='')


  35. def main():
  36.     print('main start')
  37.     pool = ThreadPool(5)
  38.     for i in range(5):
  39.         pool.apply_async(progress_bar, (100,50))
  40.         time.sleep(1)
  41.     pool.close()
  42.     pool.join()
  43.     print('main over')

  44. main()
复制代码

结果:
2.png

希望得到解惑,谢谢。。。
最佳答案
2020-11-18 18:49:39
本帖最后由 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}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-17 21:16:46 | 显示全部楼层
武婵冰 发表于 2020-11-17 12:13
**** 作者被禁止或删除 内容自动屏蔽 ****

??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 18:49:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-11-18 23:02:29 | 显示全部楼层
gonff 发表于 2020-11-18 18:49
试了一下,主要原因有两个:
其一是remain_time和sub_delta_time都没有定义;(如果你其他语句里定义了, ...

谢谢你,
我一直以为,比如: 11.23//10=1,  11.23%10 =1, 会自动华为int
这次注意到了 ^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-29 19:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表