Go chan

chan

Channel是Go中的一个核心类型,可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。

receive 操作符

<-ch用来从channel ch中接收数据,这个表达式会一直被block,直到有数据可以接收。

从一个nil channel中接收数据会一直被block。

从一个被close的channel中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)。

关闭判断

v, ok := <-ch

一个关闭的通道不会影响读取,可以通过第二个参数获取关闭状态;

chan超时控制

go 中实现超时控制的时候, select-case,粗糙地在超时的时候返回而不管尚在执行中的 goroutine 的死活。结果是,大批量调用受到几个调用超时的影响,一直超时无法恢复。

context 可以设置超时处理,解决超时退出下 goroutine 的退出问题。

案例:比如抢购锁的使用

https://ictar.xyz/2018/03/20/如何用go实现超时控制/

生产消费

package main

import "fmt"

func Producer(ch chan int) {
	for i := 1; i <= 10; i++ {
		ch <- i
		}
	close(ch)
}

func Consumer( ch chan int, done chan bool) {
	for {
		value, ok := <-ch
		if ok {
			fmt.Printf(" recv: %d\n", value)
			} else {
			fmt.Printf("closed\n")
			break
			}
		}
	done <- true
}

func main() {
	ch := make(chan int)
	done := make(chan bool)
	go Producer(ch)
	go Consumer( ch, done)
	<-done
}

发布订阅


posted @ 2020-10-11 22:25  walkingSun  阅读(478)  评论(0编辑  收藏  举报
**/