我已经看到很多关于如何在Python中基于迭代显示进度条的建议。我的问题是有没有办法根据时间做到这一点?
使用案例
func()
是非确定性函数,其运行时间从几秒到接近30分钟不等。我希望尽可能多的结果在一小时的时间内收集,因此我在一小时的时间内尽可能多地运行func()
。因此,我不想以传统方式打印更新,因为我无法知道它是否被卡住或只是长期(两者都发生)。我无法控制{{ 1}}或者我会试着减轻一些这些不幸。因此,无论func()
的运行时间是生命的标志,我都希望像每小时倒计时一样简单,每隔5分钟更新一次。
func()
我最初的想法是用线程或池做一些事情。
答案 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)