Expand description
§aetherflow-runtime — マルチコア thread-per-core actor ランタイム
design.md の 4 本柱を実装:
- ①型による隔離 / ②zero-copy move →
ActorRef::try_sendがA::Messageを move で取る。 use-after-send はコンパイルエラー(E0382)。 - ③物理配置 →
Systemが コアごとに 1 スレッドを立ててピン留めし、各スレッドが そのコアに割り当てられた多数の actor を run-to-completion で回す。mailbox はコアを跨がない lock-free キュー(mpsc)。 - ④work-stealing 排除 → Tokio 不使用。actor はコア間を移動しない(静的配置)。
§thread-per-core であって thread-per-actor ではない
1 コア = 1 OS スレッドが多数の actor を回す。actor ごとにスレッドを立てない(それは
thread-per-actor でスケールしない)。同一コアの異種 actor は型消去して 1 スレッドで回し、
送信は typed な ActorRef のまま — capability-mapping §7 の「制御面=erased / データ面=typed」。
§使い方
use aetherflow::{System, Actor};
use std::sync::mpsc;
struct Adder { sum: u64, out: mpsc::Sender<u64> }
impl Actor for Adder {
type Message = u64;
fn handle(&mut self, msg: u64) { self.sum += msg; self.out.send(self.sum).unwrap(); }
}
let sys = System::with_cores(2);
let (out, results) = mpsc::channel();
let addr = sys.spawn_on(0, Adder { sum: 0, out }); // コア 0 に配置
addr.send_blocking(10);
addr.send_blocking(5);
drop(addr); // 送信端が全て落ちると、その actor はコアから外れる
sys.shutdown(); // 全コアを停止して join
assert_eq!(results.recv().unwrap(), 10);
assert_eq!(results.recv().unwrap(), 15);§隔離はコンパイル時に強制される
ⓘ
use aetherflow::{System, Actor};
struct Order { qty: u32 }
struct E;
impl Actor for E { type Message = Order; fn handle(&mut self, m: Order) { let _ = m.qty; } }
let sys = System::with_cores(1);
let addr = sys.spawn_on(0, E);
let order = Order { qty: 100 };
addr.try_send(order).ok(); // move で移譲
println!("{}", order.qty); // use of moved value `order` (E0382):コンパイル不能Modules§
- pinning
- コア配置(best-effort)。OS ごとに「できる範囲で最も良い」ことをする。
Structs§
- Actor
Ref - actor のメールボックスへの送信ハンドル(MPSC の生産者)。
Clone可能 = 複数送信元 OK。 - Latency
Snapshot - [
LatencyHistogram::snapshot] の結果(単位は ns、分位はバケット粒度の近似)。 - Responder
- 一度だけ返信できる線形トークン(iso 的)。
replyが self を consume する。 - Spawn
Builder System::buildが返す spawn ビルダー。上級ノブを opt-in で積む(既定は単純 spawn 相当)。- System
- マルチコア actor ランタイム。
Enums§
- AskError
askの失敗理由。- Idle
Strategy - メッセージが無いときのコアスレッドの振る舞い(レイテンシ ↔ CPU/tail 堅牢性のトレードオフ)。
- Restart
Policy - supervised actor の再起動方針。無制限 restart は暴走ループになりうるので、既定は上限つき。
- Send
Error - ブロッキング送信
send_blockingの失敗理由。満杯は待つので、残るのは Closed のみ。 - TrySend
Error - 非ブロッキング送信
try_sendの失敗理由。いずれも元のメッセージを返すので、 呼び出し側は再ルーティング・永続化・ログ記録ができる。
Traits§
- Actor
- 型付き actor。メッセージ型は固定で
Send(= sendable なiso/valを型で要求)。