ホームページ  >  記事  >  バックエンド開発  >  errgroup を使用して Go ワークプールを実装すると、ゴルーチンがスタックする

errgroup を使用して Go ワークプールを実装すると、ゴルーチンがスタックする

王林
王林転載
2024-02-08 21:09:181018ブラウズ

使用 errgroup 实现 Go 工作池,goroutines 卡住

#php エディタ Apple は本日、errgroup を使用して Go ワーク プールを実装する方法を紹介します。これにより、ゴルーチンがスタックする問題が解決されます。並行プログラミングではゴルーチンを利用することで効率的な並行処理を実現できますが、特定のゴルーチンでエラーやスタックが発生するとプログラム全体の実行に影響を及ぼします。 errgroup パッケージを使用すると、ゴルーチンの実行をエレガントに管理し、エラーが発生したときにエラーを処理して、プログラムの安定性と信頼性を確保できます。これがどのように実装されるかを見てみましょう。

質問内容


任意の goroutine のエラーをキャッチできるように、errgroup を使用してワーカー プール パターンを実装しました。私の詳細は次のとおりです:

リーリー

ワーカー関数の実装は次のようになります:

リーリー

calluserapi は 403 禁止エラーを返します。これは g.wait() を呼び出し、非 nil エラーが発生した場合はすべてのゴルーチンを直ちに停止する必要があります。しかし、ここではそうではなく、g.wait() は決して呼び出されません。


解決策


いくつかの問題があります:

    ######サイクル### リーリー
  • ワーカーが各ユーザーの結果を送信するまで待ちます。

    calluserapi

    がエラーを返した場合、これは起こりません。

    ワーカーは
  • jobs
  • シャットダウン状況を処理できません。

    次のコードは、これら 2 つの問題を解決できます:
処理するユーザーと結果を配置する場所を指定するタイプを宣言します:

リーリー

この新しいタイプを使用するようにワーカー スレッドを変更します。さらに、

jobs

が閉じられたときにワーカーが終了するようにワーカーを変更します。

リーリー それらをメイン goroutine に貼り付けます: リーリー

以上がerrgroup を使用して Go ワークプールを実装すると、ゴルーチンがスタックするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。