Go協程交替列印字元

2021-09-26 03:45:03 字數 1099 閱讀 7163

需求:模擬兩個協程,分別迴圈列印字母a和b。

分析:要實現兩個協程之間的交替協作,就必須用到channel通訊機制,而channel正好是同步阻塞的。

func

main()

exit <-

true}(

)gofunc()

}()<-exit

}

結果發現列印出了abbaabba...的效果。

也就是我們控制了開始的次序,但沒有控制結束的次序,發生了併發不安全的情況。

其實半開模式也可以用於某些場景下,如: 兩個goroutine,在條件控制下,交替列印奇偶數:

func

main()

} exit <-

true}(

)gofunc()

}}()

<-exit

}

func

main()

exit <-

true}(

)gofunc()

}()<-exit

}

我們在迴圈體首尾都使用了阻塞獨佔模式,兩個chan交替釋放控制權,達到了安全的協程互動控制。

再看看下面的demo,同樣的原理:

func

main()

gofunc()

}()for

_,v :=

range str

}

func

main()

}}()

gofunc()

()for i :=

1; i <=

10; i++}}

()<-exit

}

結論:channel的本質就是同步式的生產消費模式

python3 交替列印字串 leetcode

交替列印之類的問題,一般通過乙個主線程判斷其他執行緒的進入條件,通過訊號量實現即可。此題中,通過num主線程,來判斷其他執行緒的進入條件。每個執行緒執行時,其他執行緒是被阻塞的。import threading class fizzbuzz def init self,n int self.n n ...

四個執行緒交替列印字串

於leetcode1195 編寫乙個可以從 1 到 n 輸出代表這個數字的字串的程式,但是 如果這個數字可以被 3 整除,輸出 fizz 如果這個數字可以被 5 整除,輸出 buzz 如果這個數字可以同時被 3 和 5 整除,輸出 fizzbuzz 例如,當 n 15,輸出 1,2,fizz,4,b...

go 協程等待

sync包提供了基本的同步基元,如互斥鎖 但是這裡不是討論執行緒通訊的問題 而執行緒通訊應使用channel 以前使用time.sleep 來保證執行緒執行完成,顯然執行緒執行所需要的時間不確定 sync裡面有乙個waitgroup,它是乙個結構體,可以用於等待執行緒執行 這樣不用去估算執行緒需要執...