ずん
「おい博士、Goって言語でワーカー作ったら止まらなくなったのだ。もうこのままずっと動かし続けるしかないのだ?」
でぇじょうぶ博士
「やれやれ...。`time.Ticker`の罠にハマったでやんすね。selectの不定性を理解してないと、止まるか止まらないかはガチャでやんす。」
やきう
「ガチャで決まるプログラムとか草。ワイのパチンコと同じやんけ。」
ずん
「え、マジでガチャなのだ?じゃあ何回も止めてたら、そのうち当たりが出るってことなのだ?」
でぇじょうぶ博士
「バカでやんす!selectは`ctx.Done()`と`ticker.C`の両方が受信可能になったとき、どっちを選ぶか不定でやんす。つまりタスクが長引くと、止めたいのにもう1回実行されるかもしれないでやんす。」
やきう
「確率論で動くプログラムとか、ワイの人生より不安定やな。ワイは100%ニートやけど。」
ずん
「じゃあどうすればいいのだ?もう諦めてプロセスごとkillするしかないのだ?」
でぇじょうぶ博士
「そこまで野蛮な必要はないでやんす。`ticker.C`が選ばれた後も`ctx`のキャンセル状態をチェックすれば確実でやんす。もしくはselectをシンプルな役割に限定するでやんす。」
やきう
「結局チェック処理増やすんかい。二度手間やんけ。最初から賢く書けや。」
ずん
「でも博士、チェック増やしたら処理が重くなるのだ。ボクのマシン、もう限界なのだ。」
でぇじょうぶ博士
「...ずんのマシンが限界なのは、エロ動画のキャッシュでディスクが圧迫されてるからでやんす。」
やきう
「それな。ワイも昔そうやったわ。今は全部クラウドや。」
でぇじょうぶ博士
「さらに問題があるでやんす。タスクが超長時間かかる場合、いつまで経ってもプログラムが終わらないでやんす。まるでずんの人生のように。」
でぇじょうぶ博士
「解決策は`shutdownTimeout`を設けることでやんす。一定時間待って、それでもタスクが終わらなければ強制キャンセルでやんす。まあ、処刑でやんすね。」
ずん
「処刑って...。タスクにも人権があるのだ!」
やきう
「タスクに人権www お前の倫理観どうなっとんねん。」
でぇじょうぶ博士
「タスクに渡すContextも工夫次第でやんす。親のctxをそのまま渡すか、独立したContextを渡すかで挙動が変わるでやんす。設計次第でやんすね。」
ずん
「難しすぎるのだ...。もうGoじゃなくてPythonでいいのだ?」
やきう
「Pythonならもっとカオスやぞ。GILとかいう地獄があるんやで。」
でぇじょうぶ博士
「最後に注意点でやんす。キャンセル後すぐプロセス終了すると、キャンセル処理自体が完了しない可能性があるでやんす。最低限のドレイン待ちが必要でやんす。」
やきう
「洗濯機www お前の脳みそ洗濯した方がええわ。」
でぇじょうぶ博士
「つまり、ちゃんと後片付けの時間を与えるってことでやんす。トイレ流さずに出てくような真似はダメでやんす。」
ずん
「なるほど...。じゃあ結局、Gracefulに止めるってめちゃくちゃ大変ってことなのだ?」
でぇじょうぶ博士
「そうでやんす。AIが生成したコードも、こういう落とし穴を平気で書いてくるでやんすからね。人間がちゃんと理解してないとダメでやんす。」
やきう
「AIに任せてたらアカンってことやな。ワイの就活もAIに任せたら全滅したわ。」
でぇじょうぶ博士
「selectの不定性を理解し、タイムアウトを設け、Contextを適切に扱う。これが三種の神器でやんす。まあ、ずんには難しすぎるでやんすけどね。」
ずん
「むぅ...。じゃあボク、ワーカー使うの諦めて、全部手動でやることにしたのだ!これで完璧なのだ!」