-
20-12-2019 - |
質問
私はPythonの反復に基づいてプログレスバーを表示する方法について多くの提案を見てきました。私の質問は、時間に基づいてこれを行う方法はありますか?
ユースケース
func()
実行時間が秒からほぼ30分まで変化する非決定論的関数です。私は1時間のスペースに集まることができるだけ多くの結果を望んでいるので、走っています func()
私は時間のスペースでできるだけ多くの時間。そのため、更新がスタックしているのか、長いケースであるのかを知る方法がないため、伝統的な方法で更新を印刷したくありません(両方とも発生します)。私はの制御を持っていない func()
あるいは、私はこれらの不幸のいくつかを軽減しようとします。そのため、実行時間に関係なく、5分ごとに更新される1時間からのカウントダウンのような単純なものが欲しいと思います func()
人生のしるしとして。
results = []
T1, T2 = time.time(), time.time()
while T2 - T1 < 1 * 60 * 60:
results.append( func() )
T2 = time.time()
私の最初の考えは、スレッドやプールで何かをすることです。
解決
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をログファイルにリダイレクトし、実行ごとにpercent completeステータスメッセージを出力します
あなたがスレッドをしたいように聞こえます
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)
所属していません StackOverflow