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-11Go處理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-02go使用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ǔ)言編程當(dāng)中映射和方法的基本使用
這篇文章主要介紹了淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用,是golang入門學(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