深入Go语言:并发、性能分析与C10K问题挑战
1. Go语言并发基础
在Go语言中,通道是实现并发编程的关键工具。 <- myChannel 这种形式的通道操作,其作用与以下代码片段相同:
select {
case mc := <- myChannel:
// do something
}
只要没有休眠的goroutine,一个开放的监听通道不会导致死锁。这种监听但永远不会接收任何内容的通道,是一种基本的等待方式,对于希望保持运行但不一定需要通过该通道发送数据的长时间运行的应用程序来说,是很有用的快捷方式。
2. 清理Goroutines
任何处于等待和/或接收状态的通道都可能导致死锁。幸运的是,Go语言能够很好地识别这些问题,在运行或构建应用程序时,几乎肯定会触发恐慌。许多示例中使用了 defer close() 方法,将应该在不同时间执行的相似代码块立即且干净地组合在一起。虽然垃圾回收可以处理很多清理工作,但我们仍需负责关闭开放的通道,以确保不会出现一个进程等待接收而另一个进程等待发送,两者相互等待的情况。例如以下代码:
<-youMayNotNeedToDoThis
close(youmayNotNeedToDoThis)
这里没有赋值操作,表明这可能是不必要的语法冗余。如果修改为包含赋值操作,代码将变为:
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



