26 goroutine channel同時および並列化の実装(3)

2218 ワード

チャンネルパイプ
パイプはGolangが言語レベルで提供するgoroutine間の通信方式で、channelを使用して複数のgoroutine間でメッセージを伝えることができます.goroutineがGoプログラムの同時実行体である場合、channelはそれらの間の接続です.
channelは,あるgoroutineに特定の値を別のgoroutineに送信させることができる通信メカニズムである.
Golangの同時モデルは,共有メモリではなく通信による共有メモリの実現を提唱している.
Go言語のパイプは特殊なタイプです.パイプはコンベアやキューのように、常に先入先出のルールに従い、データの送受信順序を保証します.パイプ宣言時に要素タイプを指定する必要があります.
  • channel
  • を作成
    make(chan  ,  )
    

    チャンネル操作
    パイプには、送信(send)、受信(receive)、クローズ(close)の3つの操作があり、送信および受信には が使用されます.
    ch := make(chan int, 3)
    
  • 1.送信(配管内にデータを置く)
  • ch 
  • 2.受入(配管内から値を取る)
  • x := 
  • 3.パイプを閉じる
  • 内蔵close()を呼び出してパイプを閉じる
    close(ch)
    
  • demo
  • func main() {
        //1. channel
        ch := make(chan int, 3)
        //2. 
        ch 
  • channelタイプ
  • channelは参照タイプです
    var   chan  
    var ch1 chan int // 
    var ch2 chan bool // 
    var ch3 chan []int // int 
    

    パイプに値を再割り当てた後、パイプ内から値を取ると、元のパイプが変更されたことがわかります.
    func main() {
        ch1 := make(chan int, 4)
        ch1 
  • 配管ブロック
  • func main() {
        ch := make(chan int, 1)
        ch 
  • 書きながら
  • を読む
    func main() {
        ch2 := make(chan int, 1)
        ch2 
  • for rangeパイプサイクルから
  • パイプにデータを送信したらclose関数でパイプを閉じることができます.
    パイプが閉じると、パイプに値を送信するとpanicが発生し、パイプから値を取る操作でパイプの値がキャンセルされ、取得された値は常に対応するタイプのゼロ値になります.
    var ch1 = make(chan int, 10)
    for i := 1; i <=10; i++ {
        ch1 

    forサイクルでパイプを巡ることで、閉じなくてもいいです.具体的な長さを知っているので、for rangeは無線サイクルです.
    func main() {
        var ch1 = make(chan int, 10)
        for i := 1; i <= 10; i++ {
            ch1 

    たんほうこうかんろ
    デフォルトでは、パイプは双方向であり、 / を通過することができます.
  • 読取り専用パイプ
  • var ch1 
  • 配管
  • のみ書く
    var ch1 chan

    goroutine結合channelパイプ
    2つのメソッドを定義します.1つのメソッドはパイプにデータを書き、1つのメソッドはパイプからデータを読み、同期を要求します.
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var wg sync.WaitGroup
    
    // 
    func fn1(ch chan

    注意、データを書き込む場所の待ち時間を延長しても問題なく、読み取りが完了するまでgolangのパイプは相対的に安全です