文档章节

golang注意Channel的阻塞特性

小小霸王枪
 小小霸王枪
发布于 2014/02/13 11:12
字数 286
阅读 2.3K
收藏 6

#本博客已迁移至 [www.0x520.com][1] [1]:http://www.0x520.com

之前用channel练习的时候遇到一个问题,看似好像代码合理,而且编译也不会有问题,但忘记了一个重要的channel特性。

正确的代码:

package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

func sum(x,y int,c chan int){
    c <- x + y
}

func main(){
    foo()
    c := make (chan int);
    go sum(24,18,c)
    fmt.Println(<-c);
}

如果我把代码改成:

package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

//func sum(x,y int,c chan int){
//    c <- x + y
//}

func main(){
    foo()
//    c := make (chan int);
//    go sum(24,18,c)
//    fmt.Println(<-c);
    c := make (chan int)
    d := 2
    c <- d+3 
    fmt.Println(<-c)
}

或者

package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

func sum(x,y int,c chan int){
    c <- x + y
}

func main(){
    foo()
    c := make (chan int);
    sum(24,18,c)
    fmt.Println(<-c);
}

都会出现以下错误:

Hello
World
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
	/Users/john/a1.go:20 +0x60
exit status 2

这是为什么呢,看似合理的程序,是忽略了Channel是阻塞的,如果没有使用go Channel就一直在阻塞的状态,执行就死循环了。这个特性也在很多场合带来了方便。

本文转载自:http://www.ohlinux.com/archives/820/

上一篇: qqqqq
小小霸王枪
粉丝 12
博文 44
码字总数 23501
作品 0
闵行
高级程序员
私信 提问
加载中

评论(0)

go channel的一些技巧

一个已经被关闭的 channel 永远都不会阻塞。当一个 channel 一旦被关闭,就不能再向这个 channel 发送数据,但仍然可以尝试从 channel 中获取值。 2. 已经被关闭的 channel 会实时返回。 pa...

加油2018
2013/08/23
1.8K
0
由浅入深剖析 go channel

channel 是 golang 中最核心的 feature 之一,因此理解 Channel 的原理对于学习和使用 golang 非常重要。 channel 是 goroutine 之间通信的一种方式,可以类比成 Unix 中的进程的通信方式管道...

huojiao2006
2018/11/02
0
0
golang channel 用法

golang channel 用法转的 一、Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论。但就像John Graham-Cumming所说的那样,...

wangxuwei
2018/01/29
392
0
golang基础--Gocurrency并发

goroutine只是由官方实现的超级"线程池"而已,每个实例4-5kb的栈内存占用和用于实现机制而大幅减少的创建和销毁开销。 并发不是并行(多CPU): 并发主要由切换时间片来实现"同时"运行,并行则...

failymao
2018/07/19
0
0
Java Async IO Library: Quasar (use Channel)

前言 你如果熟悉go ,fiber (对于fiber可以简单理解成为轻量级线程)和 channel 就对应go 的goroutines 和channel,在go语言中用法如下: fiber example: 什么是channel channel 用于提供不...

OrangeJoke
2016/09/25
343
0

没有更多内容

加载失败,请刷新页面

加载更多

重磅:构建AIOps的MNIST

本文作者:AIOps智能运维 干货概览 我们在《AIOps时代,你准备好了吗?》一文中提到,运维操作一般可以分为感知、决策、执行三部分,而在感知阶段我们通过识别服务指标数据中不符合预期的模式...

百度开发者中心
2019/04/07
8
0
CSS overflow属性

overflow代码及作用 代码 作用 overflow:visible 内容不会被修剪,内容会呈现在元素框外 overflow:hidden 内容会被修剪,内容其余部分不可见 overflow:scroll 内容会被修剪,显示滚动条以便查...

a-垂垂
27分钟前
15
0
南京哪里有开医药费发票

【电+薇:13564998196陈晨】幵-票,百分百保真,可先开验。从主业来看,2019年众诚保险围绕车险业务采取增设分支机构、加强合作、优化用户体验等动作,但综合成本率仍有所上行,业内指出,车...

电I3564998196溦
28分钟前
18
0
苏州哪里有开医药费发票

【電+薇:13564998196陈晨】幵-票,百分百保真,可先开验。从主业来看,2019年众诚保险围绕车险业务采取增设分支机构、加强合作、优化用户体验等动作,但综合成本率仍有所上行,业内指出,车...

电I3564998196薇
29分钟前
6
0
长春哪里有开医药费发票

【电+薇:13564998196陈晨】百分百保真,可先开验。从主业来看,2019年众诚保险围绕车险业务采取增设分支机构、加强合作、优化用户体验等动作,但综合成本率仍有所上行,业内指出,车险的价格...

电I3564998196嶶
30分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部