質問

私は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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top