人気記事
注目度の高い記事

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