← 解説「チャネル — スレッド間でデータを送る」に戻る
サンプルコードで身につける: チャネル — スレッド間でデータを送る
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小のチャネル — 1つ送って recv で待つ
チャネルの最小形です。スレッドが send した String を、メインが recv で受け取ります。値は所有権ごと移動するので、送った側はもうその値に触れません。recv は届くまでブロックするので、「完了通知を待つ」用途にそのまま使えます。
Rust
2複数の値を for で受け取る
1本の tx から複数の値を送り、rx を for で回して全部受け取る例です。送信側スレッドが終わると tx が drop され、受信ループが自然に終わるのがチャネルの便利なところです。送信元が1本だけなら、届く順序は送った順のまま保たれます。
Rust
3tx.clone() — 複数スレッドから1つの rx へ
tx.clone() で送信機を増やし、3つのスレッドから1つの rx に送り込む mpsc(複数生産者・単一消費者)の本領です。送信元が複数になると到着順は実行ごとに変わるため、順序に依存しない合計で集計しています。手元の tx を drop し忘れると受信ループが終わらない点も要注意です。
Rust
42本のチャネルでジョブと結果を往復
ジョブ用と結果用、2本のチャネルでワーカーと往復するパイプラインです。job_tx を drop することで「仕事はもう無い」とワーカーに伝わり、ワーカーの終了が結果側の受信終了に連鎖します。ワーカープールへのジョブ分配の、ワーカー1本版と考えてください。
Rust
5ワーカーの結果をチャネルで集約して並べる
ファイルごとのワーカーが集計結果をチャネルで1か所に送る、実務の並列集計の縮図です。到着順は実行ごとに変わりうるので、いったん Vec に集めて名前順にソートしてから表示し、出力を安定させています。「結果はチャネルで集めて、表示前に並べ直す」は実務でも常套手段です。
Rust