\section{\module{sched} ---
         イベントスケジューラ}

% LaTeXed and enhanced from comments in file

\declaremodule{standard}{sched}
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{一般的な目的のためのイベントスケジューラ}

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

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

例:

\begin{verbatim}
>>> 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
\end{verbatim}


\subsection{スケジューラオブジェクト \label{scheduler-objects}}

\class{scheduler}インスタンスは以下のメソッドを持っています:

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

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

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

\begin{methoddesc}[scheduler]{enter}{delay, priority, action, argument}
時間単位以上の\var{delay}でイベントをスケジュールします。
そのとき、その他の関連時間、その他の引数、効果、戻り値は、
\method{enterabs()}に対するものと同じです。
\end{methoddesc}

\begin{methoddesc}[scheduler]{cancel}{event}
キューからイベントを消去します。
もし\var{event}がキューにある現在のイベントでないならば、
このメソッドは\exception{RuntimeError}を送出します。
\end{methoddesc}

\begin{methoddesc}[scheduler]{empty}{}
もしイベントキューが空ならば、Trueを返します。
\end{methoddesc}

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

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

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