ホームページ > バックエンド開発 > Golang > 開始したゴルーチンからすべてのエラーが発生せず、一部のエラーのみが発生するのはなぜですか?

開始したゴルーチンからすべてのエラーが発生せず、一部のエラーのみが発生するのはなぜですか?

WBOY
リリース: 2024-02-09 14:40:20
転載
1236 人が閲覧しました

为什么我只收到部分错误,而不是我启动的 goroutine 中的所有错误?

php エディター Apple が答えます。Go 言語では、ゴルーチンでエラーが発生しても、メイン コルーチンには自動的に伝播されません。代わりに、暗黙的に無視されるため、起動されたすべてのゴルーチンでエラーが発生するのではなく、部分的なエラーのみが発生する可能性があります。これは、Go 言語の設計の本来の目的がプログラムの安定性と効率性を維持することであり、エラーが発生した場合でもプログラム全体がすぐに停止するわけではないためです。すべてのエラーを捕捉したい場合は、チャネルまたはその他のメカニズムを使用して、エラー情報を明示的に渡すことができます。こうすることで、すべてのエラーが正しく処理されることを確認できます。

質問内容

同時タスクを処理するためにサイクルクラスを定義しました。私が望むのは、それぞれ goroutine で 2 つの関数を実行し、それらが完了するのを待って、出力エラーをマージすることです。しかし、エラーが発生するだけです。各メソッドの役割は次のとおりです:

run - goroutine で関数を実行し、そのエラーを収集します

waitalldone - すべての関数エラーをマージし、すべての関数が完了するまで待ちます

do1、do2 - テスト関数

リーリー

最終的に t.log(err)err1 または err2 を出力しますが、err1 err2 を出力したいと考えています。なぜエラーが見逃されるのか。

解決策

これは、(*cycle).waitalldone が goroutine の収集エラーが完了するのを待機しないためです。 -race フラグを指定してコードを実行すると、いくつかのデータ競合エラーが報告される場合があります。これもその 1 つです:

リーリー

この変更により問題が解決されます:

リーリー

そして、range 句を使用して for ループを簡素化できます。

リーリー

以上が開始したゴルーチンからすべてのエラーが発生せず、一部のエラーのみが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート