golang-study/base/channel/example/main.go

56 lines
760 B
Go
Raw Normal View History

2021-11-11 00:03:38 +08:00
package main
import (
"fmt"
2021-11-11 15:46:08 +08:00
"runtime"
2021-11-11 00:03:38 +08:00
"sync"
2021-11-11 12:00:18 +08:00
"sync/atomic"
2021-11-11 00:03:38 +08:00
)
var wg = new(sync.WaitGroup)
2021-11-11 12:00:18 +08:00
var consumer = int32(0)
2021-11-11 00:03:38 +08:00
func f1(ch chan int) {
defer wg.Done()
2021-11-11 15:46:08 +08:00
for i := 0; i < 1_000_000; i++ {
2021-11-11 00:03:38 +08:00
ch <- i
}
// 使用完必须 close 不然将导致死锁
close(ch)
}
func f2(in chan int, out chan int) {
defer wg.Done()
for i := range in {
2021-11-11 15:46:08 +08:00
out <- i
2021-11-11 00:03:38 +08:00
}
2021-11-11 12:00:18 +08:00
if atomic.AddInt32(&consumer, -1) <= 0 {
2021-11-11 00:03:38 +08:00
// 使用完必须 close 不然将导致死锁
close(out)
2021-11-11 12:00:18 +08:00
}
2021-11-11 00:03:38 +08:00
}
func main() {
2021-11-11 15:46:08 +08:00
ch := make(chan int, 50)
2021-11-11 00:03:38 +08:00
ch2 := make(chan int, 5)
2021-11-11 12:00:18 +08:00
wg.Add(1)
2021-11-11 00:03:38 +08:00
go f1(ch)
2021-11-11 12:00:18 +08:00
2021-11-11 15:46:08 +08:00
wg.Add(runtime.NumCPU())
atomic.AddInt32(&consumer, int32(runtime.NumCPU()))
for i := 0; i < runtime.NumCPU(); i++ {
go f2(ch, ch2)
}
2021-11-11 00:03:38 +08:00
for i := range ch2 {
fmt.Println(i)
}
wg.Wait()
}