Go: process synchronization
package main import ( "fmt" "math" "runtime" "strconv" "strings" "time" ) func producer(intChan chan int) { for b := 1000; b <= 1099; b++ { intChan <- b } close(intChan) } func consumer(intChan chan int, primeChan chan int, exitChan chan bool) { var b, ok, flag = 0, true, true var lastNumber int for { lastNumber = b b, ok = <-intChan if !ok { exitChan <- true break } flag = true for v := 2; v < int(math.Sqrt(float64(b)))+1; v++ { time.Sleep(time.Millisecond * 30) if b%v == 0 { flag = false break } } if flag { primeChan <- b } } fmt.Printf("Goroutine(%03v) exit, last number: %v\n", GetGoroutineID(), lastNumber) } func main() { intChan := make(chan int, 100) primeChan := make(chan int, 2000) exitChan := make(chan bool, 4) go producer(intChan) for i := 0; i < cap(exitChan); i++ { go consumer(intChan, primeChan, exitChan) } go func() { for i := 0; i < cap(exitChan); i++ { <-exitChan } close(exitChan) close(primeChan) }() for { v, ok := <-primeChan if !ok { break } fmt.Printf("Prime: %v\n", v) } fmt.Printf("main Goroutine(%v) exit", GetGoroutineID()) } func GetGoroutineID() int { var buf = make([]byte, 128) b := runtime.Stack(buf, false) idField := strings.Fields(strings.TrimPrefix(string(buf[:b]), "goroutine "))[0] id, err := strconv.Atoi(idField) if err != nil { panic(fmt.Sprintf("cannot get goroutine id: %v", err)) } return id }
分类:
Go
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律