やりたいこと
- 複数立ち上がっているgoroutineの中で、それぞれ独立にSIGINT捕捉できるだろうか?という素朴な疑問
ソースコード
- 期待されるアウトプット「各goroutineのidとinterruptedというログが出る」
package main import ( "fmt" "os" "os/signal" "sync" ) func main() { wg := new(sync.WaitGroup) for i := 0; i < 10; i++ { wg.Add(1) go spawn(i, wg) } wg.Wait() fmt.Println("hoge") } func spawn(id int, wg *sync.WaitGroup) { c := make(chan os.Signal, 1) defer close(c) signal.Notify(c, os.Interrupt) sig := <-c // ↑ここでwg.Doneをblockしているので、 // Ctrl+cを押さないとDoneに至らず、 // この親プロセスは終わらないです。 fmt.Println(id, sig) wg.Done() }
実行結果
% go run main.go ^C3 interrupt 1 interrupt 2 interrupt 5 interrupt 7 interrupt 0 interrupt 9 interrupt 8 interrupt 4 interrupt 6 interrupt hoge %
- 理解した
雑感
- ねむい
DRYな備忘録として