Channel
Channel
,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。这篇文章来深入了解一下 channel。channel 的设计是基于 CSP 模型的。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。Go 语言实现了 CSP 部分理论,goroutine 对应 CSP 中并发执行的实体,channel 也就对应着 CSP 中的 channel。
Go中的Channel使用chan
에 대해 자세히 살펴보겠습니다.
Go에서 채널 사용chan
을 키워드로 사용합니다.
가능한 한 차단을 피하고 애플리케이션의 성능을 향상시킬 수 있는 버퍼 찬이 있습니다. 일반적으로 시간을 공간으로 교환합니다. 🎜🎜🎜
aChan := make(chan int) // 创建无缓冲chan bChan := make(chan int, N) // 创建缓冲为N的chan🎜할당 및 값 획득🎜🎜 다음 코드에서는 그 큰 역할을 볼 수 없습니다. 이는 일반적으로 두 문이 함께 있지 않기 때문입니다. 예: 🎜코루틴 A는 데이터를 보냅니다. 🎜. 🎜
mchan <- value // 发送值v到Channel ch中 value := <-mchan // 从Channel ch中接收数据,并将数据赋值给v🎜Select🎜🎜🎜 Selsect🎜는 채널에서 데이터를 얻는 가장 일반적인 방법입니다. 🎜
select 一定程度上可以类比于 linux 中的 IO 多路复用中的 select。后者相当于提供了对多个 IO 事件的统一管理,而 Golang 中的 select 相当于提供了对多个 channel 的统一管理。当然这只是 select 在 channel 上的一种使用方法。
func main(){ ch1 := make(chan int, 1) ch2 := make(chan int, 1) select { case e1 := <-ch1: //如果ch1通道成功读取数据,则执行该case处理语句 fmt.Printf("1th case is selected. e1=%v",e1) case e2 := <-ch2: //如果ch2通道成功读取数据,则执行该case处理语句 fmt.Printf("2th case is selected. e2=%v",e2) default: //如果上面case都没有成功,则进入default处理流程 fmt.Println("default!.") } }
for …… range语句可以处理Channel。
go func() { time.Sleep(1 * time.Hour) }() c := make(chan int) go func() { for i := 0; i < 10; i = i + 1 { c <- i } close(c) }() for i := range c { fmt.Println(i) } fmt.Println("Finished")
Select很重要的一个应用就是超时处理。因为上面提供的demo,select语句就会一直阻塞着。这时候我们可能就需要一个超时操作,用来处理超时的情况。下面这个例子我们会在2秒后往channel c1中发送一个数据,但是Select设置为1秒超时,因此我们会打印出timeout 1,而不是result 1。
c1 := make(chan string, 1) go func() { time.Sleep(time.Second * 2) c1 <- "result 1" }() select { case res := <-c1: fmt.Println(res) case <-time.After(time.Second * 1): fmt.Println("timeout 1") }
Go内建的close方法就可以用来关闭channel。但如果channel 已经被关闭,继续往它发送数据会导致panic: send on closed channel:
close(mChan)
위 내용은 Go가 없는 Go의 동시성은 네트워크가 없는 iPhone과 같습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!