我是 Go 并发的新手,所以我尝试了一个带有通道和 goroutines 的例子。我想要生产者消费者模式。生产者函数永远提供随机字符串,消费者通过将它们变成大写来修改它们。我想在有限的时间内(2 秒)运行它。
package main
import (
"fmt"
"math/rand"
"strings"
"time"
)
func producer(x []string, c chan string) {
i := 1
for i > 0 {
randomIndex := rand.Intn(len(x))
pick := x[randomIndex]
c <- pick
}
}
func consumer(x string, c chan string) {
x1 := strings.ToUpper(x)
c <- x1
}
func main() {
s := []string{"one", "two", "three", "four"}
c1 := make(chan string)
d1 := make(chan string)
go producer(s, c1)
go consumer(<-c1, d1)
stop := time.After(2000 * time.Millisecond)
for {
select {
case <-stop:
fmt.Println("STOP AFTER 2 SEC!")
return
default:
fmt.Println(<-d1)
time.Sleep(50 * time.Millisecond)
}
}
}
我只得到一个数组元素和一些错误。需要进行哪些更改才能使此示例有效?
输出:
二
致命错误:所有 goroutines 都睡着了——死锁!
goroutine 1 [chan receive]: main.main()
goroutine 6 [chan send]: main.producer({0xc00004e040, 0x4, 0x0?}, 0x0?) 由 main 创建。主要退出状态 2
幕布斯7119047
相关分类