bestpractice私はゴルーチンがある生み出されたことを確認する方法についての基本的な理解に問題を持っている長期実行中のプロセスのコンテキストで適切に「閉じました」。私はその話題に関する話を見て、ベストプラクティスについて読んでいました。私の質問を理解するためには、ビデオ "高度な同時並行パターン"を参照してください。確保ゴルーチンのクリーンアップは、
マシン上でコードを実行する場合は、環境変数GOTRACEBACK=all
をエクスポートして、パニック後にルーチン状態を見ることができます。
私はここで元の例のコードを置く:naive(それが行く遊び場で実行しない、時間の文が使用されているbacause私は推測するコードをコピーし、それをローカルに実行してください。)
の結果を実行後のナイーブな実装のパニックは、長い実行中のプロセスのために特に悪いシステム、上のダングリングゴルーチンを残すの根本的な問題を示してい
panic: show me the stacks goroutine 1 [running]: panic(0x48a680, 0xc4201d8480) /usr/lib/go/src/runtime/panic.go:500 +0x1a1 main.main() /home/flx/workspace/go/go-rps/playground/ball-naive.go:18 +0x16b goroutine 5 [chan receive]: main.player(0x4a4ec4, 0x2, 0xc42006a060) /home/flx/workspace/go/go-rps/playground/ball-naive.go:23 +0x61 created by main.main /home/flx/workspace/go/go-rps/playground/ball-naive.go:13 +0x76 goroutine 6 [chan receive]: main.player(0x4a4ec6, 0x2, 0xc42006a060) /home/flx/workspace/go/go-rps/playground/ball-naive.go:23 +0x61 created by main.main /home/flx/workspace/go/go-rps/playground/ball-naive.go:14 +0xad exit status 2
です。 (再び、遊び場、原因「プロセス上で実行可能ではないが、時間がかかりすぎる
generator pattern with quit channel
:
は、だから私の個人的な理解のために私はここで見つけることには、2つのもう少し洗練されたバリエーションを試してみました「)
最初の溶液もゴルーチン実行速度に応じて、実行されるステップで非決定論に至る、様々な理由のためにフィッティングされていません。
今、私は思った - と、ここで最後に質問が来ます! - 終了チャネルを使用した2番目のソリューションは、終了する前にシステムからすべての実行トレースを排除するのに適していると考えられます。とにかく、「時々」プログラムがあまりにも速く終了し、パニックが実行可能な、まだシステムに存在する追加のゴルーチンを報告します。パニック出力:
panic: show me the stacks goroutine 1 [running]: panic(0x48d8e0, 0xc4201e27c0) /usr/lib/go/src/runtime/panic.go:500 +0x1a1 main.main() /home/flx/workspace/go/go-rps/playground/ball-perfect.go:20 +0x1a9 goroutine 20 [runnable]: main.player.func1(0xc420070060, 0x4a8986, 0x2, 0xc420070120) /home/flx/workspace/go/go-rps/playground/ball-perfect.go:27 +0x211 created by main.player /home/flx/workspace/go/go-rps/playground/ball-perfect.go:36 +0x7f exit status 2
私の質問は:、右起こるべきではありませんこと?私はパニックに踏み込む前に、クリーンアップ状態で終了チャネルを使用します。
私はここで安全なクリーンアップ動作を実現するための最後の試みでした: artificial wait time for runnables to close
をとにかく、そのソリューションは、右感じていないと、同様ランナブルを大量に適用できないかもしれませんか?
は何が正しいクリーンアップを確保するために推奨される最も慣用的なパターンでしょうか?お時間を
おかげ
私はこの例題がどのように「プログラムが実行終了した後にシステム上にゴルーチンが舞っているか」を実証しています。ゴルーチンはGo実行時のコンセプトであり、プログラムの実行が終了すると解体されます。あなたが見ているものは、ティアダウンがまだ起こっている間に出力されます。この前にそれらがクリーンアップされた場合、ランタイムは何が起こったのかを報告できませんでした。それとも、あなたが言っていることとは完全に離れていますか? –
単純な例のルーチンは、ボールを待って共有チャネルでブロックしているため、終了できません。ビデオの重要なビットは、〜4.40分〜5.10分です。プログラム自体は終了しますが、ぶら下がったルーチンが残っています。 – flx
私はお詫び申し上げます - 私はあなたが長時間実行されているプロセスのコンテキストで話していることを認識していませんでした。実行中のプロセスが実際に終了したわけではありません。 –