shared チュートリアル

このチュートリアルでは、実行ポリシーを作って検査する方法、バックエンドが宣言している能力を問い合わせる方法、ネイティブのステータスコードを変換する方法を示します。これらは luna_thread のほかのすべてのパッケージが入力として受け取る値です。

クイックスタート

パッケージをインポートします。

import {
  "Luna-Flow/luna_thread/shared",
}

ワーカー 4、チャンク 256 要素のポリシーを作ります。

test "shared quick start" {
  let policy = @shared.make_execution_policy(worker_count=4, chunk_size=256).unwrap()
  inspect(@shared.backend_label(policy.backend), content="native")
  inspect(@shared.is_parallel(policy), content="true")
}

日常的なタスク

拒否されたポリシーを扱う

make_execution_policy は最初に見つけた問題を返すので、中断せずに報告できます。

fn describe(result : Result[@shared.ExecutionPolicy, @shared.PolicyError]) -> String {
  match result {
    Ok(policy) => "ok with \{policy.worker_count} workers"
    Err({ issue: WorkerCountMustBePositive(n) }) => "bad worker count \{n}"
    Err({ issue: ChunkSizeMustBePositive(n) }) => "bad chunk size \{n}"
    Err({ issue: UnsupportedBackendForV1(_) }) => "backend not available"
    Err({ issue: UnsupportedModeForV1(_) }) => "mode not available"
  }
}

test "rejected policies" {
  inspect(describe(@shared.make_execution_policy(worker_count=2)), content="ok with 2 workers")
  inspect(describe(@shared.make_execution_policy(chunk_size=0)), content="bad chunk size 0")
  inspect(
    describe(@shared.make_execution_policy(mode=@shared.asynchronous_mode())),
    content="mode not available",
  )
}

保存されたポリシーを再検査する

validate_policy は、ワークフローから読み戻したものなど、手元のポリシーのすべての問題を挙げます。

test "validate a stored policy" {
  let policy = @shared.native_policy()
  assert_eq(@shared.validate_policy(policy).length(), 0)
}

バックエンドの宣言を問い合わせる

test "capabilities" {
  let native = @shared.RuntimeCapabilities::for_backend(@shared.native_target())
  inspect(native.supports_async, content="false")
  let js = @shared.RuntimeCapabilities::for_backend(@shared.javascript_target())
  inspect(js.supports_zero_copy_buffers, content="true")
}

ステータスコードを変換する

test "status codes" {
  let status = @shared.native_status_from_code(6)
  debug_inspect(status, content="Overflow")
  inspect(@shared.native_status_code(status), content="6")
}

さらに進んで

ポリシーは @plan のビルダー、@workflow.Workflow::new、ファサードの make_policy に渡されます。整数コードのリクエストレコード(NativeBuffer、NativeMapRequest など)は C の構造体を写したもので、C ランタイムへの独自のバインディングを書くときに役立ちます。コードの一覧はアーキテクチャガイドにあります。

よくある落とし穴

  • ExecutionPolicy::new と javascript_policy はポリシーが拒否されると中断し、javascript_policy は v1 では必ず中断します。引数が外部から来るときは make_execution_policy を使ってください。
  • RuntimeCapabilities::for_backend は固定の表です。JavaScript の行があるからといって、JavaScript バックエンドが何かを実行するわけではありません。
  • native_status_from_code は、ワークフローのステータス 8 から 14 を含む未知のコードをすべて InvalidArgument に写します。生のコードが必要なら取っておいてください。

次のステップ

shared API にはすべての値が載っており、shared の設計ではポリシーの規則とステータスコードの対応を説明しています。plan チュートリアルではプランでポリシーを使います。