ループを毎秒 4 回実行する必要があるスレッド化されたクラスがあります。私は次のようなことができることを知っています
do_stuff()
time.sleep(0.25)
しかし問題は、 にかかる時間を考慮していないことdo_stuff()
です。事実上、これはリアルタイム スレッドである必要があります。これを達成する方法はありますか?理想的には、コードを実行していないときはスレッドをスリープ状態にします。
ループを毎秒 4 回実行する必要があるスレッド化されたクラスがあります。私は次のようなことができることを知っています
do_stuff()
time.sleep(0.25)
しかし問題は、 にかかる時間を考慮していないことdo_stuff()
です。事実上、これはリアルタイム スレッドである必要があります。これを達成する方法はありますか?理想的には、コードを実行していないときはスレッドをスリープ状態にします。
import threading
def work ():
threading.Timer(0.25, work).start ()
print "stackoverflow"
work ()
上記は、work
が 1 秒あたり 4 回の間隔で実行されることを確認します。この背後にある理論は、0.25秒後に実行される自分自身への呼び出しを「キューに入れる」ことです。 .
このため、(ほぼ) 完全に中断されることなく作業を行うことができ、1 秒あたり正確に 4 回関数を実行することに非常に近づいています。
詳細についてthreading.Timer
は、以下のリンクから python ドキュメントを参照してください。
前の関数は期待どおりに機能しますが、ヘルパー関数を作成して、将来の時限イベントの処理を支援することができます。
この例では、以下のようなもので十分です。うまくいけば、コードがそれ自体で語ってくれるでしょう - 見た目ほど高度ではありません。
正確なニーズに合わせて独自のラッパーを実装する場合は、これを参考にしてください。
import threading
def do_every (interval, worker_func, iterations = 0):
if iterations != 1:
threading.Timer (
interval,
do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
).start ()
worker_func ()
def print_hw ():
print "hello world"
def print_so ():
print "stackoverflow"
# call print_so every second, 5 times total
do_every (1, print_so, 5)
# call print_hw two times per second, forever
do_every (0.5, print_hw)