DRYな備忘録

Don't Repeat Yourself.

【Go言語】複数並列goroutineの中でのSIGINTの捕捉

やりたいこと

  • 複数立ち上がっている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な備忘録として