Go言語100Tips No.59

mizue
·

No.59: 作業負荷の種類による並行処理の影響を理解していない

  • プログラミングにおいて、作業負荷の実行時間が制限される場合。

    • CPUの速度: CPUバウンド

    • I/Oの速度: I/Oバウンド

    • 利用可能メモリの量: メモリバウンド

  • ワーカープール・パターン(worker-pooling pattern)

    • 固定サイズのワーカー(ゴルーチン)のプールを作成する。

    • 各ゴルーチンは、共通のチャネルからタスクをこのプールに受信する。

  • 作業負荷がCPUに依存している場合、GOMAXPROCSに依存するのがベストプラクティス。

    • GOMAXPROCSは実行中のゴルーチンに割り当てられるOSスレッド数を設定する環境変数。デフォルトでは、論理CPUの数に設定されている。

  • ワーカープール・パターンを実装する際に、CPUバウンドな処理であれば、最適なゴルーチン数は利用可能なスレッド数に近い値。

  • スレッド数がコア数より少ない場合、ゴルーチンはコア数ではなく、スレッド数だけ生成する必要がある。そうしなければ、一つのスレッドが2つのゴルーチンの間で実行環境を共有し、コンテキストスイッチの回数が増える。

  • ベンチマークによって仮定を検証する必要がある。

@mizue
Healthy Programmer