ずん
「goroutineがRustで作れるってマジなのだ?Go以外で動くってことは、もうGoいらないってことなのだ?」
でぇじょうぶ博士
「それは違うでやんす。これは自動車のエンジンを分解して仕組みを理解する行為でやんす。エンジンが作れたからといって、車が不要になるわけじゃないでやんすよ。」
でぇじょうぶ博士
「甘いでやんす。マイクロサービス時代では、API呼び出しの数だけ並行処理が必要になるでやんす。18
ずん
「でも10万個も動かせるって、めっちゃすごいのだ!ボクもこれで10万倍仕事ができるようになるのだ!」
やきう
「アホか。お前の仕事量は0や。0に10万かけても0のままやぞ。」
でぇじょうぶ博士
「やれやれ...。M:1モデルでは確かに10万タスク動きますが、1コアしか使えないので30秒もかかってしまうでやんす。これではせっかくの高性能CPUが宝の持ち腐れでやんすね。」
ずん
「じゃあM:Nモデルにすればいいのだ!これで4倍速くなるって書いてあるのだ!」
やきう
「待てや。記事よう読め。I/O待ちで800msもかかっとるやんけ。結局ブロックしとるやないか。」
でぇじょうぶ博士
「そこでnetwork pollerの出番でやんす。epollやkqueueを使えば、I/O待ちでスレッドをブロックせずに済むでやんすよ。」
ずん
「つまり、待ってる間に他の仕事ができるってことなのだ?それってボクが会議中にスマホゲームするのと同じなのだ?」
やきう
「それ仕事しとらんやろが。てかお前、会議出席しとるだけで給料もらっとるんか。」
でぇじょうぶ博士
「まぁ、概念としては近いでやんすね。重要なのは、Goではブロッキング関数を普通の関数と区別なく書けることでやんす。これがFunction Coloring問題の回避でやんす。」
ずん
「難しい言葉ばっかりなのだ。結局goroutineって何がすごいのだ?」
でぇじょうぶ博士
「簡単に言えば、軽量で、マルチコアを活用でき、I/O待ちも効率的で、しかも普通の関数呼び出しと同じように書ける。この4点セットでやんす。」
やきう
「でも結局Rustで実装しとるやんけ。なんでGoで実装せんかったんや?」
でぇじょうぶ博士
「そりゃあ、Goでgoroutineを実装するのは、自分の背中を自分で押すようなものでやんすからね。Rustなら低レベルな制御ができて、学習効果も高いでやんす。」
ずん
「つまり、わざわざ難しい方法を選んで自慢してるってことなのだ?」
でぇじょうぶ博士
「むぅ...確かに実用性はないでやんすが、ブラックボックスを開けて理解することに価値があるでやんす!エムスリーはそういうギークを募集してるでやんす!」
ずん
「でもボク、ブラックボックス開けるの怖いのだ。中から変なもの出てきそうなのだ。」
やきう
「お前の頭の中の方がよっぽど変なもん詰まっとるわ。」
でぇじょうぶ博士
「まぁ、この記事の肝は『goroutineは単なるグリーンスレッドではない』ということでやんす。M:Nモデル、network poller、そしてFunction Coloringの回避。これらが組み合わさって初めてgoroutineの真価が発揮されるでやんす。」
ずん
「じゃあ結論としては、Goは便利ってことでいいのだ?」
でぇじょうぶ博士
「まぁ、乱暴に言えばそうでやんすね。Goは並行処理を簡単に、効率的に書けるように設計されているでやんす。その裏側にはこれだけの工夫があるでやんすよ。」
ずん
「わかったのだ!じゃあボクもgoroutine使いまくって、10万個タスク作るのだ!エムスリーに入社して、『goroutineマスター』って名乗るのだ!」