ExperimentStore と JobRunner
実験と、実行が採点した各セルを保存するポート、そして実行をバックグラウンドで走らせるポート。
ポート: ExperimentStore と JobRunner。
indx_interfaces.protocols
で、indx_interfaces.experiments
のモデルの上に宣言しています(ADR-0082、
ADR-0083)。
Experiment は、キー、名前、元になったデータセットとルーター、候補(それぞれキー、名前、ルーターの
Branch。本番が最初)、そして作成時に凍結したものです。凍結するのは、タイプ、ルーターのバージョン、
文書、それらが持っていたラベルです。CellResult は 1 つの文書の上の 1 つの候補です。採点した行、
ページ数、まだ人が必要なページ、結果が報告したコストと時間、または失敗したときのエラーを持ちます。
class ExperimentStore(Protocol): def put(self, owner: OwnerId, experiment: Experiment) -> None: ... def get(self, owner: OwnerId, experiment_id: ExperimentId) -> Experiment | None: ... def list(self, owner: OwnerId) -> tuple[Experiment, ...]: ... def delete(self, owner: OwnerId, experiment_id: ExperimentId) -> bool: ... def put_result( self, owner: OwnerId, experiment_id: ExperimentId, result: CellResult ) -> None: ... def results(self, owner: OwnerId, experiment_id: ExperimentId) -> tuple[CellResult, ...]: ...
class JobRunner(Protocol): def submit(self, job_id: str, work: Callable[[Callable[[], bool]], None]) -> bool: ... def cancel(self, job_id: str) -> bool: ... def active(self, job_id: str) -> bool: ... def close(self) -> None: ...結果を実験の上のリストではなく独立した行にするのは、実行がセルを 1 つずつ書き、2 つのセルが書き込みを
共有してはならないからです。状態はどこにも保存しません。残りのセルは、候補と文書の積から保存された
結果を引いたものなので、プロセスと一緒に死んだ実行は停止中と読まれ、求められれば再開します。ストアを
同梱するバックエンドは memory、sqlite、postgres の 3 つで、INDX_EXPERIMENT_STORE が名指します。
JobRunner は、ドメインが自分でスレッドを作らずに、リクエストより長く続く仕事を始められるようにする
ものです。ランナーはストアと同じくプラグインです。エントリーポイント indx.job_runners で、
INDX_JOB_RUNNER が名指し、ファーストパーティのパッケージはどれもそれをインポートしません。同梱する
ものは 1 つ、indx-jobs-memory で、サーバーのプロセスの中のキューと 1 本のワーカースレッドです。
プロセスと一緒に消えます。ランナーを名指さないデプロイは、実験を保存しますが走らせません。
- オーナー。 ストアのどのメソッドも最初に
OwnerIdを取り、オーナーをまたぐものはありません。 - 同一性。 オーナーの中で、実験はそのキーで、結果はその実験、候補、文書です。
putとput_resultは置き換えます。 - 冪等性。 ないキーの
deleteはFalseで、実験の結果も一緒に消します。 - 順序。
listは実験をキー順に、resultsは候補、次にダイジェストの順に返します。 - ランナー。 すでに動いているジョブの
submitは何も始めずFalseです。cancelは次のステップの 前で止まるよう仕事に求め、動いていないジョブにはFalseです。例外を上げた仕事は記録され、ランナーを 止めません。closeはすべてのジョブに止まるよう求め、走っているものを待ちます。アプリが止まるときに 呼びます。
tests/unit/test_store_conformance.py
が、インストール済みのすべてのストアのバックエンドをこの規則に従わせます。