动态输出时间进度

时间:2014-06-03 04:13:46

标签: python progress-bar python-multithreading

我已经看到很多关于如何在Python中基于迭代显示进度条的建议。我的问题是有没有办法根据时间做到这一点?

使用案例

func()是非确定性函数,其运行时间从几秒到接近30分钟不等。我希望尽可能多的结果在一小时的时间内收集,因此我在一小时的时间内尽可能多地运行func()。因此,我不想以传统方式打印更新,因为我无法知道它是否被卡住或只是长期(两者都发生)。我无法控制{{ 1}}或者我会试着减轻一些这些不幸。因此,无论func()的运行时间是生命的标志,我都希望像每小时倒计时一样简单,每隔5分钟更新一次。

func()

我最初的想法是用线程或池做一些事情。

1 个答案:

答案 0 :(得分:1)

old_stdout = sys.stdout
sys.stdout = open("log.txt","w") # now calling print will write to this logfile
results = []
T1, T2 = time.time(), time.time()
while T2 - T1 < 1 * 60 * 60:
    results.append( func() )
    T2 = time.time()
    old_stdout.write("%0.2f%% Complete\n"%(100.0*(T2-T2)/(1.0*60*60)))

会将正常的stdout重定向到日志文件,然后在每次运行后打印完成状态消息百分比

听起来你想要一个线程

import time,threading,random

class func_thread(threading.Thread):
   def __init__(self,callback):
      self.callback = callback
      self.killed = False
      threading.Thread.__init__(self)
   def Kill(self):
      self.killed = True
   def run(self):
      while not self.killed:
          self.callback(func())

def func():
    time.sleep(random.uniform(0.5,2.0))
    return 5

seconds = 1
minutes = 60
update_interval = 25 * seconds
done_time = 5 * minutes
update_format ="# Results:%04d  Seconds Elapsed:%0.3f"
def main():
    my_results = []
    start_time = time.time()
    fs = func_thread(my_results.append)
    fs.start()
    while time.time() - start_time < done_time:
         print update_format%(len(my_results),time.time()-start_time)
         time.sleep(update_interval)
    fs.Kill()
    fs.join()
    print "DONE FINAL COUNT:",len(my_results)