chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

2022-Golang-channel

channel

channel原理

一个通道相当于一个先进先出(FIFO)的队列。也就是说,通道中的各个元素值都是严格地按照发送的顺序排列的,先被发送通道的元素值一定会先被接收。元素值的发送和接收都需要用到操作符<-。我们也可以叫它接送操作符。一个左尖括号紧接着一个减号形象地代表了元素值的传输方向。

从通道中接收值的时候 <- 写在通道变量的左边,用于表达从该通道中接收一个元素值

对通道的发送和接收操作都有哪些基本的特性?
对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的。同一个通道,发送和接收不互斥。前提是同一个数据已经被完全复制或读出chan(不能忽略chan复制、删除数据的时间)
发送操作和接收操作中对元素值的处理都是不可分割的。
发送操作在完全完成之前会被阻塞。接收操作也是如此。

发送操作和接收操作在什么时候可能被长时间的阻塞?

缓冲通道:
20220219180649
非缓冲通道:
20220219175853
20220219180006

有哪些特性?

给一个 nil channel 发送数据,造成永远阻塞
从一个 nil channel 接收数据,造成永远阻塞
给一个已经关闭的 channel 发送数据,引起 panic
从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
无缓冲的channel是同步的,而有缓冲的channel是非同步的

channel的实现原理?答了环形队列,被追问为什么用环形队列

channel使用场景

channel实现排序

channel和锁对比一下

channel和共享内存有什么优劣势?

分布式锁知道哪些?用channel如何实现?

集群用channel如何实现分布式锁

channel关闭以后,再往其发送或接收,会发生什么

发送报错
可以接收,为空时,取到的值是0;

怎么判断已经关闭,怎么判断关闭后有值?

a, ok := <-ch 判断;
channel 为空并且已经关闭,ok 参数才为false。

Golang中关闭管道channel需要注意的问题

当执行了 close(ch) ,那么就不能向 管道发送信息了,但是在关闭之前留在管道里面的消息还可以 被消费。

当之前的消息被消费完了,那么继续消费不会阻塞了,而是返回零值

巧妙使用channel实现限流器

https://studygolang.com/articles/28566?fr=sidebar

用Go语言实现一个简单生产者消费者模型,你是如何实现的

https://studygolang.com/articles/35421

分布式锁知道哪些?用channel如何实现?

集群用channel如何实现分布式锁

实现任务优先级编排!!!

https://studygolang.com/topics/12792?fr=sidebar

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道