コンテンツにスキップ

プロセス管理

子プロセスのスポーン、監視、通信。メッセージパッシング、スーパービジョン、ライフサイクル管理によるアクターモデルパターンを実装。

グローバル変数 process は常に利用可能で、require() を必要とせず、modules: に記載する必要もありません。

現在のフレームIDまたはプロセスIDを取得:

local frame_id = process.id() -- 呼び出しチェーン識別子
local pid = process.pid() -- プロセスID

PIDまたは登録名でプロセスにメッセージを送信:

local ok, err = process.send(destination, topic, ...)
パラメータ説明
destinationstringPIDまたは登録名
topicstringトピック名(@で始まることはできない)
...anyペイロード値

権限: ターゲットPIDに対するprocess.send

-- 基本的なスポーン
local pid, err = process.spawn(id, host, ...)
-- 監視付き(EXITイベントを受信)
local pid, err = process.spawn_monitored(id, host, ...)
-- リンク付き(異常終了時にLINK_DOWNを受信)
local pid, err = process.spawn_linked(id, host, ...)
-- リンクと監視の両方
local pid, err = process.spawn_linked_monitored(id, host, ...)
パラメータ説明
idstringプロセスソースID(例: "app.workers:handler"
hoststringホストID(例: "app:processes"
...anyスポーンされたプロセスに渡される引数

権限:

  • プロセスidに対するprocess.spawn
  • ホストidに対するprocess.host
  • 監視バリアントの場合はプロセスidに対するprocess.spawn.monitored
  • リンクバリアントの場合はプロセスidに対するprocess.spawn.linked
-- プロセスを強制終了
local ok, err = process.terminate(destination)
-- オプションの理由付きでグレースフルキャンセルをリクエスト
local ok, err = process.cancel(destination, "shutting down")
パラメータ説明
destinationstringPIDまたは登録名
reasonstringターゲットに配信されるオプションの理由

権限: ターゲットPIDに対するprocess.terminateprocess.cancel

既存のプロセスを監視またはリンク:

-- 監視:ターゲット終了時にEXITイベントを受信
local ok, err = process.monitor(destination)
local ok, err = process.unmonitor(destination)
-- リンク:双方向、異常終了時にLINK_DOWNを受信
local ok, err = process.link(destination)
local ok, err = process.unlink(destination)

権限: ターゲットPIDに対するprocess.monitorprocess.unmonitorprocess.linkprocess.unlink

local options = process.get_options()
local ok, err = process.set_options({trap_links = true})
フィールド説明
trap_linksbooleanLINK_DOWNイベントがeventsチャネルに配信されるかどうか

メッセージとライフサイクルイベントを受信するためのチャネルを取得:

local inbox = process.inbox() -- @inboxトピックからのMessageオブジェクト
local events = process.events() -- @eventsトピックからのライフサイクルイベント
定数説明
process.event.CANCELキャンセルがリクエストされた
process.event.EXIT監視されたプロセスが終了
process.event.LINK_DOWNリンクされたプロセスが異常終了
フィールド説明
kindstringイベントタイプ定数
fromstringソースPID
resultanyEXIT用: 返された値(正常終了時に存在)
erroranyEXIT用: エラー(異常終了時に存在)
reasonstringCANCEL用: プロセスがキャンセルされている理由

カスタムトピックをサブスクライブ:

local ch = process.listen(topic, options)
process.unlisten(ch)
パラメータ説明
topicstringトピック名(@で始まることはできない)
options.messagebooleantrueならMessageオブジェクト、falseなら生のペイロードを受信

inboxまたは{message = true}で受信する場合:

local msg = inbox:receive()
msg:topic() -- string: トピック名
msg:from() -- string|nil: 送信者PID
msg:payload() -- Payload: ラッパー(値を取得するには :data() を呼び出す)
msg:payload():data() -- any: 実際のペイロード値

プロセスをスポーンし、結果を待って返す:

local result, err = process.exec(id, host, ...)

権限: プロセスidに対するprocess.exec、ホストidに対するprocess.host

PIDを保持しながら現在のプロセスを新しい定義にアップグレード:

-- 新しいバージョンにアップグレード、状態を渡す
process.upgrade(id, ...)
-- 同じ定義を維持、新しい状態で再実行
process.upgrade(nil, preserved_state)

子プロセス用のカスタムコンテキスト付きスポーナーを作成:

local spawner = process.with_context({request_id = "123"})

権限: “context”に対するprocess.context

process.with_options(options) は、コンテキスト値の代わりにスポーン時のオプション(例: ネットワークセレクタ)を持つスポーナーを作成します:

local spawner = process.with_options({network = "app:tor_proxy"})
オプション説明
networkstring子プロセスの送信接続に使用するnetwork.*エントリのレジストリID

権限: “context”に対するprocess.context。ネットワークの選択にはさらに、そのネットワークIDに対するnetwork.selectが必要。

SpawnBuilderはイミュータブル — 各メソッドは新しいインスタンスを返す:

spawner:with_context(values) -- コンテキスト値を追加
spawner:with_actor(actor) -- セキュリティアクターを設定
spawner:with_scope(scope) -- セキュリティスコープを設定
spawner:with_name(name) -- プロセス名を設定
spawner:with_message(topic, ...) -- スポーン後に送信するメッセージをキュー
spawner:with_options(options) -- スポーン時のオプションをマージ(例: network)

権限: :with_actor():with_scope() には “security” に対する process.security

spawner:spawn(id, host, ...)
spawner:spawn_monitored(id, host, ...)
spawner:spawn_linked(id, host, ...)
spawner:spawn_linked_monitored(id, host, ...)

モジュールレベルのspawn関数と同じ権限。

名前でプロセスを登録し、PIDの代わりにその名前で到達します。destination を受け取る関数(sendterminatecancelmonitorlink など)はすべて、PIDの代わりに登録済みの名前を受け付けます。

local ok, err = process.registry.register(name) -- self、ローカルスコープ
local pid, err = process.registry.lookup(name)
local ok, err = process.registry.unregister(name)

オプションの scope 引数は名前の整合性保証を選択します。デフォルトは LOCAL です。4つのスコープとその保証はクラスタガイドで説明されています。要約:

定数可視性保証
process.registry.LOCALこのノードのみ即時、ノードローカル
process.registry.EVENTUALクラスタ全体最終的整合性(ゴシップ)
process.registry.CONSISTENTクラスタ全体線形化可能なシングルトン(Raft)
process.registry.STRONGクラスタ全体Consistent かつすべてのライブノードが確認

スタンドアロンノードでは LOCAL のみ意味があります。クラスタスコープにはクラスタリングが必要です。

local ok, err = process.registry.register(name, pid, scope)
パラメータ必須デフォルト説明
namestringはい登録する名前
pidstringいいえself登録するPID。デフォルトは呼び出しプロセス
scopenumberいいえLOCAL上記のスコープ定数のいずれか

成功時は true、失敗時は nil, error を返します。競合(異なるPIDに同じ名前がクラスタスコープで既に登録されている)は errors.ALREADY_EXISTS を返します。同じPIDに同じ名前を登録することは冪等です。STRONG 登録はすべてのライブノードが確認するか予約期限が切れるまでブロックします。タイムアウト時はエラーを返します。

別のPIDを代理して登録する場合は、対象PIDに対する process.registry.foreign 権限が追加で必要です。

local pid, err = process.registry.lookup(name)

登録されたPID文字列を返すか、名前が登録されていない場合は errors.NOT_FOUNDnil, error を返します。

local ok, err = process.registry.unregister(name, scope)

scope はデフォルトで LOCAL で、名前が登録されたスコープと一致する必要があります。CONSISTENTSTRONG の場合、所有プロセスが登録解除を許可されます。別のPIDが所有する名前を登録解除すると false を返します。名前は所有プロセスが終了したとき(クラスタスコープの場合はそのノードが離脱したとき)にも自動的に解放されるため、明示的な登録解除は早期解放のためのものです。

権限は呼び出しプロセスが何をできるかを制御します。すべてのチェックは呼び出し元のセキュリティコンテキスト(アクター)をターゲットリソースに対して使用します。

ポリシーは以下に基づいて許可/拒否できます:

  • Actor: リクエストを行うセキュリティプリンシパル
  • Action: 実行される操作(例: process.send
  • Resource: ターゲット(PID、プロセスid、ホストid、または名前)
  • Attributes: pid(呼び出し元のプロセスID)を含む追加コンテキスト
権限関数リソース
process.spawnspawn*()process id
process.spawn.monitoredspawn_monitored()spawn_linked_monitored()process id
process.spawn.linkedspawn_linked()spawn_linked_monitored()process id
process.hostspawn*()exec()host id
process.sendsend()target PID
process.execexec()process id
process.terminateterminate()target PID
process.cancelcancel()target PID
process.monitormonitor()target PID
process.unmonitorunmonitor()target PID
process.linklink()target PID
process.unlinkunlink()target PID
process.contextwith_context()”context”
process.security:with_actor():with_scope()”security”
process.registry.registerregistry.register()name
process.registry.unregisterregistry.unregister()name
process.registry.foreignregistry.register()target PID

クラスタ名前スコープはこれらのアクションのスコープサフィックス付きバリアント(process.registry.register.eventual.consistent.strong および対応する unregister アクション)で承認されるため、ポリシーでローカル名前付けとクラスタ全体の名前付けを別々に許可できます。

一部の操作は複数の権限を要求します:

操作必要な権限
spawn()process.spawn + process.host
spawn_monitored()process.spawn + process.spawn.monitored + process.host
spawn_linked()process.spawn + process.spawn.linked + process.host
spawn_linked_monitored()process.spawn + process.spawn.monitored + process.spawn.linked + process.host
exec()process.exec + process.host
カスタムactor/scope付きスポーンspawn権限 + process.security
条件種別
コンテキストが見つからないerrors.INVALID
フレームコンテキストが見つからないerrors.INVALID
必須引数がないerrors.INVALID
予約済みトピックプレフィックス(@errors.INVALID
無効な期間フォーマットerrors.INVALID
名前が登録されていないerrors.NOT_FOUND
権限拒否errors.PERMISSION_DENIED
名前が既に登録済みerrors.ALREADY_EXISTS

エラーの処理についてはエラー処理を参照。