Rust 初心者のための非同期入門:上司と部下にたとえてわかるFutureとランタイム
非同期処理は難しそう…でもちょっとした視点の切り替えで、実はぐっとわかりやすくなるんです。 本記事では、VOICEVOX に登場するキャラクター「ずんだもん」「めたん」「つむぎ」の対話形式で、非同期処理・ランタイム・async fn in traits など Rust の重要トピックを親しみやすく解説します。
Tokio はどんな上司? async-std との違いは? そして FFI の外注先とは?
あなたのRustライフの視界が変わるかもしれません。
この記事は ChatGPT で生成しました。
ずんだもん「非同期処理ってなに?ポーリングってめんどうそう…」
めたん「それ、上司と部下に例えると分かりやすいですよ」
ずんだもん:
非同期処理って、いまいちピンとこないのだ。 「Future を poll する」とか「ランタイムが必要」とか、聞いただけで混乱してしまうのだ。
めたん:
よくあるつまずきポイントですね。じゃあ、お仕事に例えてみましょうか。 非同期処理を理解するには、「自分が手を動かす」視点じゃなくて、「他人に仕事を任せて管理する」上司のような視点が必要なんですよ。
ずんだもん:
上司…? ますますわからなくなってきたのだ。
めたん:
たとえば、ずんだもんが料理中に煮物を火にかけたとしましょう。 ずっと鍋の前にはいませんよね? 時々フタを開けて「焦げてないかな?」って確認しますよね? それが、ポーリング(poll)っていう考え方なんですよ。
ずんだもん:
なるほど、それならイメージできるのだ! poll() は鍋チェックなのだ。
めたん:
そうそう。非同期処理では、部下(Future)に「これお願い」って頼むだけではダメで、 終わったかどうかを上司(イベントループ)が定期的に確認する必要があるんです。
ずんだもん:
なるほど…。でも、Rust には Tokio って便利そうなものがあるのだ?
めたん:
Tokio は超優秀だけどマイルールが強い部長みたいな存在です。 Tokio 部長の指揮下では何でもやってくれるけど、その分 Tokio 式で全部揃えないと動かせないんですよ。
ずんだもん:
じゃあ、Tokio 部長のやり方が通じないと困る場面もあるのだ?
めたん:
そうです。たとえば外注先、つまり FFI(C や Python)とやり取りするとき、Tokio のルールが通じないんです。 ランタイムを立てて poll を回すなんて、普通はやりませんから。
ずんだもん:
じゃあ、ほかに柔軟なやり方はあるの?
めたん:
あります。たとえば async-std 課長みたいな存在は、少人数で動きやすくて、ルールもゆるめ。 あるいは現場の係長(手動 poll)のように、自分で一件ずつ様子を見るやり方もあります。
つるぎ(ナレーション):
ちなみに、煮物を見守ったり、洗濯機の終了を確認するのも、poll の一種と考えられます。 Rust で非同期処理を書くというのは、まさにこの「見守る仕事」をコードで表すということなんです。
Discussion