GoroutineのIDを取得したり名前をつけたりできない理由

  • 22
    Like
  • 3
    Comment
More than 1 year has passed since last update.

Goroutineには内部的にIDが振られているけど、そのIDをGoから取得するAPIは提供されていない。一般に複数のgoroutineが走っている時、今どのgoroutineから実行されているのかを実行時に知る方法はない。

これが不便だという話がたまに出てくるようだ。こないだはデバグ時などに使うためにgoroutineに名前をつけられるようにしようという提案がgolang-devに投げられていた。

これはリジェクトされたのだが、なぜかというと、そういう機能は確かに便利でもあるだろうけど、それを提供するとgoroutineの状態に依存したコードを書くのにも使われてしまうから。

Goroutineにローカルな状態に依存したコードは安全ではない(1つのgoroutineからしか呼べない)。たとえば「UIのAPIはメインスレッドから呼んでください」というふうな感じになる。これはgoroutineを必要なだけ作って簡単に仕事を分割できるようにするというGoのやり方に反する。なのでそういう悪いデザインのAPIが作られてしまわないように、goroutineはあえて名無しになっている。

それでもどうしてもIDを取得したい! という場合、runtime.Stackでスタックトレースを文字列として取得して、その1行目にgoroutineのIDが含まれているので、それをパーズするということはできる。無論これはあえて取得できないようにしているものを迂回して取得しているだけなので、自分でなにをやっているのかよく理解していない限りやるべきではないけど。