Go语言channel

channel

单纯将函数并发是没有意义的.函数与函数间需要交换数据才能体现并发执行的意义.

共享内存进行数据交换会导致goroutine发生竞态问题.为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必会导致阻塞问题.

Go语言的并发模型是CSP(Communicating Sequential Process),提倡通过通信共享内存而不是通过共享内存而实现通信.

如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接.channel是一个可以让一个goroutine发送特定值到另一个goroutine的通信机制.

Go语言中的通道(channel)是一种特殊的类型.通道像一个队列,遵循FIFO原则.每一个通道都是一个具体类型的的导管,也就是声明channel的时候需要为其指定元素类型.

channel类型

var 变量 chan 元素类型

例:

var ch1 chan int  // 声明一个传递整形的通道
var ch2 chan bool  // 声明一个传递布尔型的通道
var ch3 chan []int  // 声明一个传递int切片的通道

创建channel

通道是引用类型,通道类型的空值是nil

var ch chan int
fmt.Println(ch)  // nil

// 声明channel后需要使用make函数初始化之后才能使用.创建channel的格式:
make(chan 元素类型, [缓冲大小])
ch1 := make(chan int)  // 不带缓冲区的通道初始化
ch2 := make(chan bool, 16)  // 带缓冲区的通道初始化
ch3 := make(chan []int)

channel信息传递

发送

ch <- 10  // 把10发送到ch中

接收

x := <- ch  // 从ch中接收值并赋值给变量x
<-ch  // 从ch中接收值,忽略结果

关闭

close(ch)

单向通道

func f(ch chan<- int)  // 声明f()中,ch只能作为写入通道
func f(ch <-chan int)  // 声明f()中,ch只能作为读取通道

channel总结

channel常见异常总结

channel异常情况总结
channelnil非空空的满了没满
接收阻塞接收值阻塞接收值接收值
发送阻塞发送值发送值阻塞发送值
关闭panic关闭成功,读完数据后返回零值关闭成功,返回零值关闭成功,读完数据后,返回零值关闭成功,读完数据后,返回零值

关闭已经关闭的channel,也会触发panic

worker pool (goroutine池)

编写代码实现一个计算随机数的每个位置之和的程序,要求使用goroutinechannel构建生产者和消费者模式,可以指定启动的goroutine数量:worker pool模式。

工作中通常使用worker pool模式,控制goroutine的数量,防止 goroutine泄露和暴涨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值