0

いくつかの値を計算し、1時間ごとにグラフを作成するスレッドを実行しているPythonスクリプトを書いています。私がやりたいのは、次の更新が行われるまでの残り時間を教えてくれる関数をそのスレッドに含めることです。私の現在の実装は次のとおりです。

class StatsUpdater(threading.Thread):

    def __init__(self, updateTime):
        threading.Thread.__init__(self)
        self.event = threading.Event()
        self.updateTime = updateTime

    def run(self):
        while not self.event.is_set():
            self.updateStats()
            self.event.wait(self.updateTime)

    def updateStats(self):
        print "Updating Stats"
        tables = SQLInterface.listTables()

        for table in tables:
            PlotTools.createAndSave(table)

    def stop(self):
        self.event.set()

だから私が欲しいのは、そのクラスに別の関数を追加して、self.event.wait(self.updateTime)がタイムアウトするまでの残り時間を返すことです。

def getTimeout(self):
    return self.event.timeRemaining()

これはどういうわけか可能ですか?

4

2 に答える 2

1

残り時間を直接取得することはサポートされていませんが、数回スリープして、残り時間を追跡することができます。

def __init__(self, updateTime):
    threading.Thread.__init__(self)
    self.event = threading.Event()
    self.updateTime = updateTime
    self.wait_time=None

def run(self):
    while not self.event.is_set():
        self.updateStats()
        try:
            self.wait_time=self.updateTime
            inttime=int(self.updateTime)
            remaining=inttime-self.updateTime
            self.event.wait(remaining)
            for t in reversed(range(inttime)): 
                self.wait_time=t+1
                self.event.wait(1)
        finally:
            self.wait_time=0

そして、

def getTimeout(self):
    return self.wait_time
于 2012-08-05T16:49:47.007 に答える
1

了解しました。問題に妥協があります。StatsUpdater.runに変数を実装しました。

self.lastUpdateTime = int(time.time())

更新機能を実行する直前。

getTimeout()を呼び出すと、次のようになります。

def getTimeout(self):
    timePassed = int(time.time() - self.lastUpdateTime
    return self.updateTime - timePassed

このように、計算集約型のスレッドを実行して毎秒小額を計算することはありませんが、更新間の時間もわかっているので、次の更新がいつになるかについてはかなり良い指標が得られます;)

于 2012-08-05T20:33:39.133 に答える