LoginSignup
39
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-16

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が含まれているので、それをパーズするということはできる。無論これはあえて取得できないようにしているものを迂回して取得しているだけなので、自分でなにをやっているのかよく理解していない限りやるべきではないけど。

39
26
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
26