Skip to content

Instantly share code, notes, and snippets.

@methane
Created February 10, 2013 07:45
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save methane/4748822 to your computer and use it in GitHub Desktop.
Save methane/4748822 to your computer and use it in GitHub Desktop.
GOMAXPROCSについてのメモ
gogoutineてGOMAXPROCSを設定しない限りはシングルスレッドなんですねえ。
GOMAXPROCSはもうちょっとだけ複雑です。
同時に動けるgoroutineの数の制限なのですが、
read などのブロックするかもしれないシステムコールを発行する場合、発行前に「現在実行中のゴルーチン数」をデクリメントして、
システムコールから返ってきたらそれをインクリメントします。
で、デクリメントした時に、他に動けるスレッドがいなかったらスレッド起動して、他のgoroutineが動けるようにします。
他のスレッドがすでにあって眠っていたら、それを起こしてgoroutineを実行させます。
なので、ブロックする処理としない処理を混ぜてもいい感じに動くのです。
で、その、スレッドを作ったり起動したりするのが実はちょっとだけ重いので、ベンチマーク結果を良くするためにはその処理が走らないように、
GOMAXPROCSをCPU数程度にするのではなく、32とか64とか豪華に設定すると良かったりします。
GOMAXPROCS不足で動けない(実行可能状態の) goroutine が存在しない場合、スレッドの作成やスレッドを起こす処理が実行されないので。
もっとその辺の処理を改善しようとしている人はいますが、つい昨日 Go 1.1 の design freeze が起こったので、早くても Go 1.2 待ちです。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment