16

ループを毎秒 4 回実行する必要があるスレッド化されたクラスがあります。私は次のようなことができることを知っています

do_stuff()
time.sleep(0.25)

しかし問題は、 にかかる時間を考慮していないことdo_stuff()です。事実上、これはリアルタイム スレッドである必要があります。これを達成する方法はありますか?理想的には、コードを実行していないときはスレッドをスリープ状態にします。

4

2 に答える 2

41

簡単な解決策

import threading

def work (): 
  threading.Timer(0.25, work).start ()
  print "stackoverflow"

work ()

上記は、workが 1 秒あたり 4 回の間隔で実行されることを確認します。この背後にある理論は、0.25秒後に実行される自分自身への呼び出しを「キューに入れる」ことです。 .

このため、(ほぼ) 完全に中断されることなく作業を行うことができ、1 秒あたり正確に 4 回関数を実行することに非常に近づいています。


詳細についてthreading.Timerは、以下のリンクから python ドキュメントを参照してください。


RECOMMENDED] より高度で動的なソリューション

前の関数は期待どおりに機能しますが、ヘルパー関数を作成して、将来の時限イベントの処理を支援することができます。

この例では、以下のようなもので十分です。うまくいけば、コードがそれ自体で語ってくれるでしょう - 見た目ほど高度ではありません。

正確なニーズに合わせて独自のラッパーを実装する場合は、これを参考にしてください。

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)

于 2012-07-15T02:26:30.283 に答える