### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python v2.6.2 documentation »
- Python 標準ライブラリ »
- 9. データ型 »

# 9.8. `sched` — イベントスケジューラ

`sched` モジュールは一般的な目的のためのイベントスケジューラを実装するクラスを定義します:

class `sched.``scheduler`(timefunc, delayfunc)

  `scheduler` クラスはイベントをスケジュールするための一般的なインターフェースを定義します。それは”外部世界”を実際に扱うための 2つの関数を必要とします — timefunc は引数なしで呼出し可能であるべきで、そして数(それは”time”です, どんな単位でもかまいません) を返すようにします。 delayfunc は1つの引数(timefunc の出力と互換)で呼出し可能であり、その時間だけ遅延しなければいけません。 各々のイベントが、マルチスレッドアプリケーションの中で他のスレッドが実行する機会の許可を実行した後に、 delayfunc は引数 `0` で呼 ばれるでしょう。

例:

    >>> import sched, time
    >>> s = sched.scheduler(time.time, time.sleep)
    >>> def print_time(): print "From print_time", time.time()
    ...
    >>> def print_some_times():
    ...     print time.time()
    ...     s.enter(5, 1, print_time, ())
    ...     s.enter(10, 1, print_time, ())
    ...     s.run()
    ...     print time.time()
    ...
    >>> print_some_times()
    930343690.257
    From print_time 930343695.274
    From print_time 930343700.273
    930343700.276

マルチスレッド環境において、 `scheduler` クラスにはスレッドセーフのための制限があります。 現在実行中のスケジューラに対して、中断中のタスクよりも前に新しいタスクを挿入することはできません。 もし挿入しようとすると、メインスレッドはイベントキューが空になるまで動作しなくなります。 代わりに、より推奨される方法として、 `threading.Timer` クラスを利用してください。

例:

    >>> import time
    >>> from threading import Timer
    >>> def print_time():
    ...     print "From print_time", time.time()
    ...
    >>> def print_some_times():
    ...     print time.time()
    ...     Timer(5, print_time, ()).start()
    ...     Timer(10, print_time, ()).start()
    ...     time.sleep(11)  # sleep while time-delay events execute
    ...     print time.time()
    ...
    >>> print_some_times()
    930343690.257
    From print_time 930343695.274
    From print_time 930343700.273
    930343701.301

## 9.8.1. スケジューラオブジェクト

`scheduler` インスタンスは以下のメソッドと属性を持っています:

`scheduler.``enterabs`(time, priority, action, argument)

  新しいイベントをスケジュールします。引数 time は、コンストラクタへ渡された timefunc の戻り値と互換な数値型でなければいけません。 同じ time によってスケジュールされたイベントは、それらの priority によって実行されるでしょう。

  イベントを実行することは、 `action(*argument)` を実行することを意味します。 argument は action のためのパラメータを保持するシーケンスでなければいけません。

  戻り値は、イベントのキャンセル後に使われるかもしれないイベントです (`cancel()` を見よ)。

`scheduler.``enter`(delay, priority, action, argument)

  時間単位以上の delay でイベントをスケジュールします。そのとき、その他の関連時間、その他の引数、効果、戻り値は、 `enterabs()` に対するものと同じです。

`scheduler.``cancel`(event)

  キューからイベントを消去します。もし event がキューにある現在のイベントでないならば、 このメソッドは `RuntimeError` を送出します。

`scheduler.``empty`()

  もしイベントキューが空ならば、Trueを返します。

`scheduler.``run`()

  すべてのスケジュールされたイベントを実行します。この関数は次のイベントを(コンストラクタへ渡された関数 `delayfunc()` を使うことで)待ち、そしてそれを実行し、イベントがスケジュールされなくなるまで同じことを繰り返します。

  action あるいは delayfunc は例外を投げることができます。いずれの場合も、スケジューラは一貫した状態を維持し、例外を伝播するでしょう。 例外が action によって投げられる場合、イベントは `run()` への呼出しを未来に行なわないでしょう。

  イベントのシーケンスが、次イベントの前に、利用可能時間より実行時間が長いと、スケジューラは単に遅れることになるでしょう。イベントが落ちることはありません; 呼出しコードはもはや適切でないキャンセルイベントに対して責任があります。

`scheduler.``queue`

  > 読み込み専用の属性で、これからのイベントが実行される順序で格納されたリストを返します。 各イベントは、次の属性を持った名前付きタプル(named tuple)の形式になります。

  > > time, priority, action, argument

  バージョン 2.6 で追加.

### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python v2.6.2 documentation »
- Python 標準ライブラリ »
- 9. データ型 »