目次
基本的な構造と使用
使用するときに無視できるポイント
実際のシナリオでの一般的な使用

GO SYNC.WAITGROUPの例

Jul 09, 2025 am 01:48 AM
go

sync.waitgroupは、ゴルチンのグループがタスクを完了するのを待つために使用されます。そのコアは、3つの方法で協力することです。追加、完了、待機です。 1。追加(n)は、ゴルチンの数を待つように設定します。 2。done()は各ゴルチンの端で呼び出され、カウントは1つ減少します。 3。待機()すべてのタスクが完了するまでメインコルーチンをブロックします。使用する場合は、注意してください。Goroutineの外部で追加する必要があります。重複を避け、Donが呼び出されていることを確認してください。 Deferで使用することをお勧めします。これは、Webページの同時クロール、バッチデータ処理、その他のシナリオで一般的であり、並行性プロセスを効果的に制御できます。

GO SYNC.WAITGROUPの例

実際には、Go's sync.WaitGroupを使用して、特に複数のゴルチンを同期する場合は、同時タスクを管理することが非常に一般的です。簡単に言えば、コルーチンのセットが完了するのを待つために使用されるカウンターです。

GO SYNC.WAITGROUPの例

以下は、それを使用する方法を説明する簡単な例です。これは、同時プログラミングが初めての友人に適しています。


基本的な構造と使用

Waitgroupには3つの主な方法があります: Add(n)Done() 、およびWait()

GO SYNC.WAITGROUPの例
  • Add(n) :待機するゴルチンの数を設定します。
  • Done() :各ゴルチンが実行された後に1回呼び出されます。これは、カウンターを1つ減らすのに相当します。
  • Wait() :すべてのタスクがDone()呼び出すまで、現在のコルーチンをブロックします。

基本的な例を示しましょう:

パッケージメイン

輸入 (
    「FMT」
    「同期」
    "時間"
))

func main(){
    var wg sync.waitgroup

    i:= 0; I <3;私 {
        wg.add(1)
        go func(id int){
            wg.done()を延期する
            fmt.printf( "goroutine%d start \ n"、id)
            time.sleep(time.second)
            fmt.printf( "goroutine%d done \ n"、id)
        }(id)
    }

    wg.wait()
    fmt.println( "すべてのゴルチンが終了しました。")
}

この例では、3つのゴロウチンが開始され、メイン関数は終了する前に実行されるまで待機します。

GO SYNC.WAITGROUPの例

使用するときに無視できるポイント

WaitGroupは簡単ですが、注意を払わないと、いくつかの詳細がエラーになりやすいです。

  • ADDは外部Goroutine
    と呼ばれます
    GoroutineをAddと、追加される前にWait()が実行される可能性があり、早期に終了します。

  • 重複した待機を避けてください
    ステータスを明示的にリセットしない限り、再利用するための待機グループは推奨されません。それ以外の場合、 Wait() 2回目の呼び出しはブロックされない場合があります。

  • 完了は
    と呼ばれる必要があります
    Done()電話をかけるのを忘れた場合、プログラムはWait()に陥ります。 deferを使用するのは良い習慣です。必ず実行してください。


実際のシナリオでの一般的な使用

データのバッチ処理や外部インターフェイスの並列要求など、他の構造を備えたWaitGroupを使用する場合があります。

複数のWebページコンテンツを同時にcraうとしたいとしたら、次のように書くことができます。

 urls:= [] string {"https://example.com/1"、 "https://example.com/2"、...}

var wg sync.waitgroup

_、url:= range urls {
    wg.add(1)
    go func(u string){
        wg.done()を延期する
        //リクエストをシミュレートして、err:= http.get(u)
        err!= nil {
            fmt.println( "エラーフェッチ:"、u)
            戻る
        }
        fmt.println( "fetched:"、resp.status)
    }(u)
}

wg.wait()

このモードは、クローラーとバックグラウンドタスク処理で非常に一般的です。


基本的にそれだけです。 sync.WaitGroupの基本的な使用法と予防策を習得することにより、同時実行プロセスを適切に制御できます。

以上がGO SYNC.WAITGROUPの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOアプリケーションの標準プロジェクトレイアウトは何ですか? GOアプリケーションの標準プロジェクトレイアウトは何ですか? Aug 02, 2025 pm 02:31 PM

答えは次のとおりです。GOアプリケーションには必須のプロジェクトレイアウトがありませんが、コミュニティは一般に、保守性とスケーラビリティを改善するために標準構造を採用しています。 1.CMD/プログラムの入り口を保存します。各サブディレクトリは、CMD/MyApp/Main.goなどの実行可能ファイルに対応しています。 2.内部/保存プライベートコード、外部モジュールによってインポートすることはできず、ビジネスロジックとサービスのカプセル化に使用されます。 3.PKG/ストア他のプロジェクトをインポートするための公に再利用可能なライブラリ。 4.API/オプションでOpenapi、Protobuf、およびその他のAPI定義ファイルを保存します。 5.Config/、Scripts/、およびWeb/Store構成ファイル、スクリプト、Webリソース。 6.ルートディレクトリにはgo.mod and go.sumが含まれています

Goのラインごとにファイルをどのように読みますか? Goのラインごとにファイルをどのように読みますか? Aug 02, 2025 am 05:17 AM

bufio.scannerを使用することは、行ごとにファイルを読み取るために最も一般的で効率的な方法であり、大きなファイル、ログ解析、構成ファイルなどのシナリオを処理するのに適しています。 1. os.openを使用してファイルを開き、deferfile.close()を介してファイルを閉じるようにしてください。 2. bufio.newscannerを介してスキャナーインスタンスを作成します。 3。fals scanner.scan()を呼び出して、falsが返されるまで行ごとに読み取り、ファイルの最後に到達したりエラーが発生したりすることを示します。 4。scanner.text()を使用して、現在のラインコンテンツ(newline文字を除く)を取得します。 5.ループが終了したら、scanner.err()を確認して、読み取りエラーをキャッチします。この方法にはメモリ効果があります

IF-ELSE IN GOのような条件付きステートメントをどのように使用しますか? IF-ELSE IN GOのような条件付きステートメントをどのように使用しますか? Aug 02, 2025 pm 03:16 PM

GoのIF-Elseステートメントは括弧を必要としませんが、巻き毛の装具を使用する必要があります。スコープを制限する場合の変数の初期化をサポートします。条件は、エラーチェーンを介して審査できます。これは、エラーチェックによく使用されます。可変宣言と条件の組み合わせは、コードのシンプルさとセキュリティを改善することができます。

GOでコマンドラインフラグをどのように解析しますか? GOでコマンドラインフラグをどのように解析しますか? Aug 02, 2025 pm 04:24 PM

Goのフラグパッケージは、コマンドラインパラメーターを簡単に解析できます。 1. flag.type()を使用して、文字列、整数、ブール膜などのタイプフラグを定義します。 2。flag.typevar()を介して変数にフラグを解析して、ポインター操作を避けることができます。 3。flag.parse()を呼び出した後、flag.args()を使用して後続の位置パラメーターを取得します。 4。flag.valueインターフェイスを実装すると、カスタムタイプをサポートして、ほとんどの単純なCLI要件を満たすことができます。複雑なシナリオは、SPF13/COBRAライブラリに置き換えることができます。

GO Webアプリケーションでルーティングをどのように処理しますか? GO Webアプリケーションでルーティングをどのように処理しますか? Aug 02, 2025 am 06:49 AM

GOアプリケーションでのルーティングは、プロジェクトの複雑さに依存します。 1.標準のライブラリNet/HTTPSERVEMUXは、外部依存関係のない単純なアプリケーションに適しており、軽量ですが、URLパラメーターと高度なマッチングをサポートしていません。 2。CHIなどのサードパーティルーターは、モジュラー設計に適したミドルウェア、パスパラメーター、ネストされたルーティングを提供します。 3. GINは、APIやマイクロサービスに適した優れたパフォーマンス、組み込みのJSON処理、リッチ機能を備えています。柔軟性、パフォーマンス、または機能統合が必要かどうかに基づいて選択する必要があります。小規模プロジェクトは標準的なライブラリを使用しており、中型および大規模プロジェクトはChiまたはGinを推奨し、最終的に単純なものから複雑なものまでスムーズな拡大を達成します。

Goで定数をどのように宣言しますか? Goで定数をどのように宣言しますか? Aug 02, 2025 pm 04:21 PM

GOでは、定数はconstキーワードを使用して宣言され、値を変更することはできず、タイプまたはタイプのものではありません。 1. constpi = 3.14159などの単一の定数宣言。 2。ブロック内の複数の定数宣言はconst(pi = 3.14159; language = "go"; isCool = true)などです。 3。constsecondsinminuteint = 60などの明示的なタイプ定数。 4. IOTAを使用して、const(日曜日= IOTA;月曜日、火曜日)などの列挙値を生成し、値0、1、および2を順番に割り当て、IOTAはビット操作などの式に使用できます。定数はコンパイル時に値を決定する必要があります。

Go Runコマンドは何をしますか? Go Runコマンドは何をしますか? Aug 03, 2025 am 03:49 AM

Gorunは、GOプログラムをすばやくコンパイルして実行するコマンドです。 1.コンパイルを完了して1つのステップで実行し、一時的な実行可能ファイルを生成し、プログラムが終了した後に削除します。 2。これは、開発とテストが簡単なメイン機能を含む独立したプログラムに適しています。 3.マルチファイル操作をサポートし、Gorun*.goまたはすべてのファイルを介して実行できます。 4.依存関係を自動的に処理し、モジュールシステムを使用して外部パッケージを解析します。 5.ライブラリやパッケージには適しておらず、永続的なバイナリファイルを生成しません。したがって、スクリプト、学習、頻繁な変更中の迅速なテストに適しています。それは効率的で簡潔なランニング方法です。

GOでSQLデータベースに接続する方法は? GOでSQLデータベースに接続する方法は? Aug 03, 2025 am 09:31 AM

GOのSQLデータベースに接続するには、データベース/SQLパッケージと特定のデータベースドライバーを使用する必要があります。 1.データベース/SQLパッケージとドライバー(github.com/go-sql-driver/mysqlなど)は、ドライバーが初期化にのみ使用されることを示す前に強調することに注意してください。 2。sql.open( "mysql"、 "user:password@tcp(localhost:3306)/dbname")を使用してデータベースハンドルを作成し、db.ping()を呼び出して接続を確認します。 3.db.query()を使用してクエリを実行し、db.exec()を実行して実行します

See all articles