8

goroutine は複数の OS スレッドに多重化されているため、I/O の待機中などに 1 つがブロックされても、他のスレッドは引き続き実行されることを理解しています。しかし、n個のゴルーチンを作成した場合に生成されるスレッドの数を事前に知る方法はありますか?

たとえば、以下の関数を呼び出すと、n 個のゴルーチンに対して作成されるシステム スレッドの数 (または最大数) がわかります。

type Vector []float64

// Apply the operation to n elements of v starting at i.
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
    for ; i < n; i++ {
        v[i] += u.Op(v[i])
    }
    c <- 1;    // signal that this piece is done
}
4

3 に答える 3

8

各ゴルーチンは一度に最大 1 つのスレッドを使用できます。スレッドを使用するかどうかは、何をしているかによって異なります。GOMAXPROCS の値は、Go コードを自由に実行することで使用できるスレッドの数、つまり並列処理の最大レベルを決定します。

ただし、GOMAXPROCS=1 であっても、ゴルーチンがシステム呼び出しまたは C への呼び出しで直接ブロックする場合は、より多くのスレッドを使用できます。

次の操作では、ブロック時にゴルーチンがスレッドを使用することはありません。

  • チャネル操作
  • ネットワーク操作
  • 睡眠
  • 同期パッケージ内のすべてのプリミティブ

これは、たとえば、/dev/ttyxx を開いて読み取り時にブロックするゴルーチンが多数ある場合、それぞれにスレッドを使用することを意味します。大量のプロセスを実行し、それらが終了するのを待っている場合も同様です。

于 2012-05-25T11:55:12.150 に答える
7

Pike's Go Course PDF スライド (3 日目) によると:

...ユーザーレベルの並列処理が必要な場合は、 を設定$GOMAXPROCSまたは呼び出す必要がありますruntime.GOMAXPROCS(n)GOMAXPROCS一度に実行するシステムコールブロックされていないゴルーチンの数をランタイムスケジューラに伝えます。

このブログ投稿にも基づいて、環境変数を設定するとGOMAXPROCS、スレッドの数を修正できるようです。ただし、この値を指定しない場合、ランタイムが管理するデフォルトのスレッド数を取得する方法がわかりません。

このブログ投稿は、環境変数を設定しない場合、ランタイムは 1 つのコアしか使用しないことを暗示しているようです (おそらく、1 つのプロセスしか使用していないためです)。

于 2009-11-12T23:38:38.087 に答える
3

現在、gccgo はゴルーチンごとに 1 つのスレッドを作成します。

6gはわかりません。

于 2009-11-11T13:57:39.183 に答える