"sched" --- イベントスケジューラー
**********************************

**ソースコード:** Lib/sched.py

======================================================================

"sched" モジュールは、汎用的なイベントスケジューラーを実装するクラスを
定義しています:

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

   "scheduler" クラスはイベントをスケジュールするための一般的なインタ
   ーフェースを定義します。 それは "外の世界" を実際に扱うための2つの
   関数を必要とします --- *timefunc* は引数なしで呼ばれて 1 つの数値を
   返す callable オブジェクトでなければなりません (戻り値は任意の単位
   で「時間」を表します)。 *delayfunc* は 1 つの引数を持つ callable オ
   ブジェクトでなければならず、その時間だけ遅延する必要があります (引
   数は *timefunc* の出力と互換)。 *delayfunc* は、各々のイベントが実
   行された後に引数 "0" でも呼ばれます。 これは、マルチスレッドアプリ
   ケーションの中で他のスレッドが実行する機会を与えるためです。

   バージョン 3.3 で変更: *timefunc* と *delayfunc* がオプション引数に
   なりました。

   バージョン 3.3 で変更: "scheduler" クラスをマルチスレッド環境で安全
   に使用出来るようになりました。

以下はプログラム例です:

   >>> import sched, time
   >>> s = sched.scheduler(time.time, time.sleep)
   >>> def print_time(a='default'):
   ...     print("From print_time", time.time(), a)
   ...
   >>> def print_some_times():
   ...     print(time.time())
   ...     s.enter(10, 1, print_time)
   ...     s.enter(5, 2, print_time, argument=('positional',))
   ...     # enter() は相対時刻なので、優先度の高い 'keyword' が 'positional' の後に実行される
   ...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
   ...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
   ...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
   ...     s.run()
   ...     print(time.time())
   ...
   >>> print_some_times()
   1652342830.3640375
   From print_time 1652342830.3642538 second enterabs
   From print_time 1652342830.3643398 first enterabs
   From print_time 1652342835.3694863 positional
   From print_time 1652342835.3696074 keyword
   From print_time 1652342840.369612 default
   1652342840.3697174


スケジューラオブジェクト
========================

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

scheduler.enterabs(time, priority, action, argument=(), kwargs={})

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

   イベントを実行することは、 "action(*argument, **kwargs)" を実行する
   ことを意味します。 *argument* は *action* のための位置引数を保持す
   るシーケンスでなければいけません。 *kwargs* は *action* のためのキ
   ーワード引数を保持する辞書でなければいけません。

   戻り値は、後にイベントをキャンセルする時に使われる可能性のあるイベ
   ントです ("cancel()" を参照)。

   バージョン 3.3 で変更: *argument* 引数が任意になりました。

   バージョン 3.3 で変更: *kwargs* 引数が追加されました。

scheduler.enter(delay, priority, action, argument=(), kwargs={})

   現在から *delay* 時間単位後にイベントをスケジュールします。 時刻を
   相対値で指定する点を除き、引数、動作、戻り値は "enterabs()" と同じ
   です。

   バージョン 3.3 で変更: *argument* 引数が任意になりました。

   バージョン 3.3 で変更: *kwargs* 引数が追加されました。

scheduler.cancel(event)

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

scheduler.empty()

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

scheduler.run(blocking=True)

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

   *blocking* が偽の場合、キュー内に、現在の *timefunc* の値以下の時刻
   を持つイベントがあれば、それらをすべて直ちに実行します。 その後、現
   在の *timefunc* の値から、キュー内で次に予定されているイベントの時
   刻までの差を返します。 キューが空の場合は "None" を返します。

   *action* または *delayfunc* が例外を送出することがあります。 どちら
   の場合もスケジューラーは一貫した状態を保ち、例外を伝播します。
   *action* が例外を送出した場合、その後 "run()" を呼び出しても、その
   イベントを再試行しません。

   一連のイベントの実行時間が次のイベントまでの時間を超えると、スケジ
   ューラーの実行が遅れます。 イベントを破棄することはありません。 不
   要になったイベントのキャンセルは、呼び出し側のコードで行う必要があ
   ります。

   バージョン 3.3 で変更: *blocking* 引数が追加されました。

scheduler.queue

   読み出し専用の属性で、これから起こるイベントが実行される順序で格納
   されたリストを返します。各イベントは、次の属性 time, priority,
   action, argument, kwargs を持った *named tuple* の形式になります。
