3

私はゴルーチンの「ワーカープール」を使用するGoアプリを構築しています。最初に、プールを開始して多数のワーカーを作成します。4 コアの CPU など、マルチコア プロセッサの最適なワーカー数はいくつになるのだろうかと考えていました。現在、次のアプローチを使用しています。

    // init pool
    numCPUs := runtime.NumCPU()

    runtime.GOMAXPROCS(numCPUs + 1) // numCPUs hot threads + one for async tasks.
    maxWorkers := numCPUs * 4

    jobQueue := make(chan job.Job)

    module := Module{
        Dispatcher: job.NewWorkerPool(maxWorkers),
        JobQueue:   jobQueue,
        Router:     router,
    }

    // A buffered channel that we can send work requests on.
    module.Dispatcher.Run(jobQueue)

完全な実装は以下にあります

job.NewWorkerPool(maxWorkers) および module.Dispatcher.Run(jobQueue)

ワーカー プールの使用例: リクエストを受け入れて複数の外部 API を呼び出し、それらの結果を 1 つのレスポンスに集約するサービスがあります。結果の順序は関係ないため、各呼び出しは他の呼び出しとは独立して実行できます。呼び出しをワーカー プールにディスパッチし、各呼び出しは 1 つの使用可能なゴルーチンで非同期に行われます。私の「リクエスト」スレッドは、ワーカー スレッドが完了するとすぐに結果を取得して集計している間、リターン チャネルをリッスンし続けます。すべてが完了すると、最終的な集計結果がレスポンスとして返されます。各外部 API 呼び出しは可変の応答時間をレンダリングする可能性があるため、一部の呼び出しは他の呼び出しよりも早く完了する可能性があります。

4

1 に答える 1