チャネルを示す次のプログラムを検討してください。
package main
import (
"fmt"
)
func pinger(c chan string) {
for i := 0; ; i++ {
c <- "ping"
}
}
func ponger(c chan string) {
for i := 0; ; i++ {
c <- "pong"
}
}
func printer(c chan string) {
for {
msg := <-c
fmt.Println(msg)
//time.Sleep(time.Second * 1)
}
}
func main() {
var c = make(chan string)
go pinger(c)
go ponger(c)
go printer(c)
var input string
fmt.Scanln(&input)
}
time.Sleep
呼び出しのコメントを外すと、出力は "ping"と "pong"になり、予測可能な方法で順番に表示されます。ただし、コメントを追加すると、順序が予測できなくなります。私はGoの初心者で、この同期を有効にしたのは何だろうと思います。待機時間を追加すると、残りのチャネルフィーダーがラインを牽引するのはなぜですか?
Sleep()と同期の間に関係はありますか?
番号
チャネルに送信された値とチャネルから取得した値の間で同期が行われます。
var c = make(chan string)
チャネルc
は文字列型の値を一度に1つ保持できます。値がチャネルから取得されるまで<- c
。関数pinger
、ponger
チャネルに値を送信できませんc
(つまり、ピンガーとポンガーは、プリンター関数から読み取るまで、チャネルに値を送信するのを待っています)。
したがって、あなたの例では、プリンタ関数のSleep
チャネルから値を読み取るためにfuncを介して時間遅延を導入しましたc
。
それがSleep
func の助けを借りて素敵で遅い読み取りをする理由です:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加