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 チュートリアルではプランでポリシーを使います。