$ go build
$ ./app
GOMAXPROC=12
t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t2: 0
t3: 0
t3: 1
t3: 2
t3: 3
t3: 4
t2: 1
t2: 2
t2: 3
t2: 4
$ taskset -c 0 ./app
GOMAXPROC=1
t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t2: 0
t2: 1
t2: 2
t2: 3
t2: 4
t3: 0
t3: 1
t3: 2
t3: 3
t3: 4
package main | |
import ( | |
"fmt" | |
"os" | |
"runtime" | |
"sync" | |
) | |
const ( | |
LOOP_COUNT = 5 | |
) | |
func init() { | |
fmt.Printf("GOMAXPROC=%d\n", runtime.GOMAXPROCS(0)) | |
} | |
func main() { | |
var ( | |
ch = make(chan string) | |
wg = sync.WaitGroup{} | |
fn = func(wg *sync.WaitGroup, ch chan<- string, prefix int) { | |
defer wg.Done() | |
for i := 0; i < LOOP_COUNT; i++ { | |
ch <- fmt.Sprintf("t%d: %d", prefix, i) | |
} | |
} | |
) | |
wg.Add(3) | |
go fn(&wg, ch, 1) | |
go fn(&wg, ch, 2) | |
go fn(&wg, ch, 3) | |
go func() { | |
defer close(ch) | |
wg.Wait() | |
}() | |
for v := range ch { | |
fmt.Fprintln(os.Stderr, v) | |
} | |
} |