go語(yǔ)言實(shí)現(xiàn)兩個(gè)協(xié)程交替打印
方法一:使用兩個(gè)channel
這里channel CA 必須要有緩沖區(qū),否則最后會(huì)報(bào)錯(cuò) fatal error: all goroutines are asleep - deadlock!
這是因?yàn)闊o(wú)緩沖的通道只有在有接收方能夠接收值的時(shí)候才能發(fā)送成功,否則會(huì)一直處于等待發(fā)送的階段。因?yàn)樽詈蠼惶孢\(yùn)行完后沒(méi)有協(xié)程可以接收CA通道中的數(shù)據(jù),所以會(huì)一直阻塞發(fā)生死鎖
package main
import (
?? ?"fmt"
?? ?"sync"
)
var wg sync.WaitGroup
var CA chan int
var CB chan int
func main(){
?? ?wg = sync.WaitGroup{}
?? ?CA = make(chan int,1)
?? ?CB = make(chan int)
?? ?wg.Add(2)
?? ?go A()
?? ?go B()
?? ?CA<-1
?? ?wg.Wait()
}
func A(){
?? ?for i:=0;i<5;i++{
?? ??? ?<-CA
?? ??? ?fmt.Println(2*i)
?? ??? ?CB<-1
?? ?}
?? ?wg.Done()
}
func B(){
?? ?for i:=0;i<5;i++{
?? ??? ?<-CB
?? ??? ?fmt.Println(2*i+1)
?? ??? ?CA<-1
?? ?}
?? ?wg.Done()
}方法二:使用一個(gè)channel
使用無(wú)緩沖的channel,使兩個(gè)協(xié)程同步,按照相同的步調(diào)執(zhí)行,但因?yàn)橐惶娲蛴∷圆荒苊看瓮胶蠖即蛴。屧撦敵龅膮f(xié)程輸出,不該輸出的協(xié)程不輸出
package main
import (
? ?"fmt"
? ?"sync"
)
var wg sync.WaitGroup
var CA chan int
func main(){
? ?wg = sync.WaitGroup{}
? ?CA = make(chan int)
? ?wg.Add(2)
? ?go A()
? ?go B()
? ?wg.Wait()
}
func A(){
? ?for i:=0;i<10;i++{
? ? ? CA<-1
? ? ? if i%2 == 0{
? ? ? ? ?fmt.Println(i)
? ? ? }
? ?}
? ?wg.Done()
}
func B(){
? ?for i:=0;i<10;i++{
? ? ? <-CA
? ? ? if i%2 == 1{
? ? ? ? ?fmt.Println(i)
? ? ? }
? ?}
? ?wg.Done()
}到此這篇關(guān)于go語(yǔ)言實(shí)現(xiàn)兩個(gè)協(xié)程交替打印的文章就介紹到這了,更多相關(guān)go協(xié)程交替打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Prometheus Go client library使用方式詳解
這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Go處理json數(shù)據(jù)方法詳解(Marshal,UnMarshal)
這篇文章主要介紹了Go處理json數(shù)據(jù)的方法詳解,Marshal(),UnMarshal(),需要的朋友可以參考下2022-04-04
對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解
今天小編就為大家分享一篇對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
如何控制Go編碼JSON數(shù)據(jù)時(shí)的行為(問(wèn)題及解決方案)
今天來(lái)聊一下我在Go中對(duì)數(shù)據(jù)進(jìn)行 JSON 編碼時(shí)遇到次數(shù)最多的三個(gè)問(wèn)題以及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-02-02
go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Go語(yǔ)言中如何通過(guò)方法為類(lèi)型添加行為
這篇文章主要介紹了Go語(yǔ)言中如何通過(guò)方法為類(lèi)型添加行為的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用
這篇文章主要介紹了淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用,是golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能
最近項(xiàng)目開(kāi)發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時(shí)需要特定的格式,所以本文給大家介紹了基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
淺析go中Ticker,Timer和Tick的用法與區(qū)別
在go面試的時(shí)候,面試官經(jīng)常會(huì)問(wèn)time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多,今天就跟隨小編一起來(lái)詳細(xì)學(xué)一下這幾個(gè)的區(qū)別吧2023-10-10

