2009-07-31 9 views
3

複数の周期タイマを作成する標準のPythonモジュールはありますか? 私は、1つのスレッドで異なる周期性の複数の周期タイマーを作成することをサポートするシステムを設計したいと考えています。システムは、任意の時点で特定のタイマーを取り消すことができなければならない。複数周期タイマ

事前にお問い合わせいただきありがとうございます!

答えて

2

あなたは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) 

それとも、スタックレスを見てすることができますあなたがやりたいことに理想的に適していて、上記のスケジューラーよりもはるかにきめ細かなタスク切り替えが可能です。

+0

NIHのように見えますが、Alex Martelliが指し示すschedモジュールを使用することができます。 – ddaa

+0

このアプローチはマイクロコントローラでよく見られます。マルチプロセスコンピューティングでは他のプロセスに対するペナルティを心配する必要はありませんが、これは少し高価です。 –

6

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を使用するのではなく、優先度を設定することもできます(のデフォルト値はです)。