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

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

WBOY
WBOY転載
2024-02-09 14:40:201180ブラウズ

为什么我只收到部分错误,而不是我启动的 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 までご連絡ください。