コンテンツにスキップ

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 が、インストール済みのすべてのストアのバックエンドをこの規則に従わせます。