複数の周期タイマを作成する標準のPythonモジュールはありますか? 私は、1つのスレッドで異なる周期性の複数の周期タイマーを作成することをサポートするシステムを設計したいと考えています。システムは、任意の時点で特定のタイマーを取り消すことができなければならない。複数周期タイマ
事前にお問い合わせいただきありがとうございます!
複数の周期タイマを作成する標準のPythonモジュールはありますか? 私は、1つのスレッドで異なる周期性の複数の周期タイマーを作成することをサポートするシステムを設計したいと考えています。システムは、任意の時点で特定のタイマーを取り消すことができなければならない。複数周期タイマ
事前にお問い合わせいただきありがとうございます!
あなたは1つのスレッドに固執する必要がある場合 - 、タスクのリストを維持する周波数とともに、彼らが実行する必要があり、どのような関数が呼び出される必要があります。
import time
def example1():
print 'Example'
class Task(object):
def __init__(self, func, delay, args=()):
self.args = args
self.function = func
self.delay = delay
self.next_run = time.time() + self.delay
def shouldRun(self):
return time.time() >= self.next_run
def run(self):
self.function(*(self.args))
self.next_run += self.delay
# self.next_run = time.time() + self.delay
tasks = [Task(example1, 1)] # Run example1 every second
while True:
for t in tasks:
if t.shouldRun():
t.run()
time.sleep(0.01)
それとも、スタックレスを見てすることができますあなたがやりたいことに理想的に適していて、上記のスケジューラーよりもはるかにきめ細かなタスク切り替えが可能です。
schedモジュールをPythonの標準ライブラリでチェックアウトしてください。それ自体は定期的なタイマー、1回だけの「イベント」を直接サポートしませんが、1回限りのイベントを定期的なタイマー適用されます(実際の作業を行う前に、呼び出し可能な一回限りのイベントを処理して次回の繰り返しで再スケジューリングします)。キーのアイデアをカプセル化するために、「予定の定期的なタイマー」クラスを定義するのに便利かもしれ
:
class spt(object):
def __init__(self, scheduler, period):
self._sched = scheduler
self._period = period
self._event = None
def start(self):
self._event = self._sched.enter(0, 0, self._action,())
def _action(self):
self._event - self._sched.enter(self._period, 0, self._action,())
self.act()
def act(self):
print "hi there"
def cancel(self):
self._sched.cancel(self._event)
予定の定期的なタイマー、サブクラスSPTに意味のあるアクションを関連付けるとact
メソッドをオーバーライドするには、(Aテンプレート法の設計パターン)。もちろん、__init__
は、スケジューラー(例:self.scheduler
)とピリオド(秒で浮動小数点として、標準的な方法で時間をインスタンス化すると.timeとtime.sleep);オプションで上記の優先度0を使用するのではなく、優先度を設定することもできます(のデフォルト値はです)。
NIHのように見えますが、Alex Martelliが指し示すschedモジュールを使用することができます。 – ddaa
このアプローチはマイクロコントローラでよく見られます。マルチプロセスコンピューティングでは他のプロセスに対するペナルティを心配する必要はありませんが、これは少し高価です。 –