【こうぞうかへいこうせい】

構造化並行性 とは?

公開:
💡 並行処理も「スコープ」で管理すれば、迷子のタスクはいなくなる

並行タスクのライフタイムをスコープ内に閉じ込め、タスクのリークや競合を防ぐプログラミングパラダイム。スコープを抜けるとすべてのタスクが完了・キャンセルされることが保証される。

📌 このページのポイント
構造化並行性:スコープがタスクを管理する 非構造化(リーク発生) spawn(task A) spawn(task B) ← 管理なし task A task B スコープ終了後もタスクが残存 → リーク・競合の原因 構造化(スコープ管理) async with TaskGroup: task A task B スコープ終了時に全タスク完了を保証 タスクリーク・競合が構造的に防止される エラーも一括でキャンセル伝播
構造化並行性:スコープを使ってタスクのリークを防ぐ
ひよこ ひよこ
並行処理って、タスクをたくさん同時に動かすやつだよね?何が難しいの?
ペンギン先生 ペンギン先生
タスクを起動したはいいけど、どこで終わるか管理できなくなるのが問題なんだよ。「タスクリーク」って言って、気づいたらゾンビタスクだらけになることがあるんだ。
ひよこ ひよこ
ゾンビタスク!それは怖いね。どうやって解決するの?
ペンギン先生 ペンギン先生
構造化並行性は「スコープ」を使う方法だよ。async withブロックみたいな構文でスコープを作って、その中でタスクを生成する。スコープを抜けるとき、すべてのタスクが必ず終わることが保証されるんだ。
ひよこ ひよこ
スコープを閉じたら全部終わるの?それなら安心だね!
ペンギン先生 ペンギン先生
そうなんだよ。タスクの1つがエラーになっても、残りのタスクは自動でキャンセルされてスコープ外に漏れ出さない。エラー伝播もスコープ単位でまとめて扱えるんだ。
ひよこ ひよこ
どんな言語で使えるの?
ペンギン先生 ペンギン先生
Pythonのasyncio(TaskGroup)、KotlinのCoroutineScope、SwiftのTaskGroup、それにJavaの仮想スレッドを使うStructuredTaskScopeなんかが代表例だよ。
ひよこ ひよこ
構造化プログラミングって昔のgotoをなくした話と似てる気がする!
ペンギン先生 ペンギン先生
鋭いね!まさにその考え方を並行処理に応用したんだよ。「goto廃止でコードの流れを構造化したように、タスク生成を構造化しよう」という発想なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「構造化並行性」って出てきたら「並行タスクのスコープ管理」と思えればだいたいOK!
📖 おまけ:英語の意味
「Structured Concurrency」 = 構造化並行性
💬 「構造化プログラミング」(goto廃止)の思想を並行処理に適用した概念で、Martin Sústrik や Nathaniel J. Smith らが2016年頃に提唱したんだよ
← 用語集にもどる