2 回答
TA贡献1853条经验 获得超6个赞
写入完整通道的尝试将被阻塞,直到其他一些 goroutine 从中读取。在您的程序中,没有其他 goroutines。因此,当您写入完整通道时,主 goroutine 会阻塞,并且由于没有其他 goroutine,因此主 goroutine 不可能继续进行。那是一个僵局。
TA贡献1887条经验 获得超5个赞
添加到上述答案: https ://stackoverflow.com/a/61512364/4106031
package main
import (
"fmt"
"github.com/practo/klog/v2"
"os"
"os/signal"
"syscall"
"time"
)
func producer(msgBuf chan<- string) {
for i := 0; ; i++ {
fmt.Printf("sent: %d\n", i)
msgBuf <- fmt.Sprintf("%d", i)
time.Sleep(1 * time.Second)
}
}
func process(msgBuf <-chan string) {
time.Sleep(10 * time.Second)
for {
select {
case msg := <-msgBuf:
fmt.Printf("processing: %v\n", msg)
time.Sleep(10 * time.Second)
fmt.Printf("processed: %v\n", msg)
}
}
}
func main() {
msgBuf := make(chan string, 2)
go producer(msgBuf)
go process(msgBuf)
sigterm := make(chan os.Signal, 1)
signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM)
for {
select {
default:
case <-sigterm:
klog.Info("SIGTERM signal received")
os.Exit(1)
}
}
}
当您在不同的 go 例程中运行它们时,这不会导致死锁。
- 2 回答
- 0 关注
- 198 浏览
添加回答
举报