go語言實現(xiàn)兩個協(xié)程交替打印
方法一:使用兩個channel
這里channel CA 必須要有緩沖區(qū),否則最后會報錯 fatal error: all goroutines are asleep - deadlock!
這是因為無緩沖的通道只有在有接收方能夠接收值的時候才能發(fā)送成功,否則會一直處于等待發(fā)送的階段。因為最后交替運行完后沒有協(xié)程可以接收CA通道中的數(shù)據(jù),所以會一直阻塞發(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()
}方法二:使用一個channel
使用無緩沖的channel,使兩個協(xié)程同步,按照相同的步調(diào)執(zhí)行,但因為要交替打印所以不能每次同步后都打印,要讓該輸出的協(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語言實現(xiàn)兩個協(xié)程交替打印的文章就介紹到這了,更多相關(guān)go協(xié)程交替打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 實現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊
這篇文章主要介紹了Golang 實現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
詳解Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束
這篇文章主要為大家詳細介紹了Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2024-02-02

