クラッシュにもかかわらずゴルーチンを実行し続ける
Go では、ゴルーチンは強力ですが、エラーやパニックによるクラッシュの影響を受けやすい可能性があります。 1 つのゴルーチンの障害が他のゴルーチンに影響を及ぼさないようにするために、開発者は、影響を受けないゴルーチンを実行し続ける方法はないかと考えるかもしれません。
パニックから回復するには、組み込みの reverse() 関数が使用されます。これにより、遅延関数内でパニックを捕捉することができます。次のヘルパー関数、protect() は、このメカニズムを使用して、パニック回復を伴うゴルーチンを起動します。
func protect(f func()) { defer func() { if err := recover(); err != nil { log.Printf("Recovered: %v", err) } }() f() }
この保護を使用するには、単に関数を引数として protected() に渡します。この呼び出しを、継続的に「tick」を出力する for ループ内でラップすることで、別の goroutine でパニックが発生した場合でも、protect() で保護された goroutine がどのように実行を継続するかを実証できます。
func main() { go protect(doPanic) for { time.Sleep(time.Second) fmt.Println("tick") } }
このテスト アプリケーション出力は次のとおりです:
2021/03/04 14:12:31 about to panic 2021/03/04 14:12:31 Recovered: test tick tick tick ...
ご覧のとおり、保護された goroutine は実行と出力を続行しながら、doPanic 関数のパニックは回復して処理されます。 「カチカチ」。このアプローチにより、ゴルーチンがパニックから効果的に分離され、単一の障害が伝播してアプリケーション全体がクラッシュすることがなくなります。
以上がパニック後でも Go ゴルーチンを実行し続けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。