ホームページ >バックエンド開発 >Golang >Go の同時実行性は、ネットワークのない iPhone のようなものです

Go の同時実行性は、ネットワークのない iPhone のようなものです

Go语言进阶学习
Go语言进阶学习転載
2023-07-21 14:13:52724ブラウズ
# Golang の同時実行属性 は、この言語の大きな致命的要因です。同時実行について話すとき、# について言及せずにはいられません。 ##チャネル は、同時コア ユニットが通信用のデータを送受信できるパイプと考えることができます。この記事では、channel について詳しく説明します。
#チャネルの設計は CSP モデルに基づいています。 CSP とは Communicating Sequential Process の略で、中国語では Communicating Sequential Process とも呼ばれ、1977 年に Tony Hoare によって提案された並列プログラミング モデルです。簡単に言えば、CSP モデルは同時に実行されるエンティティ (スレッドまたはプロセス) で構成され、エンティティはメッセージを送信することで通信します。メッセージを送信するときに使用されるチャネルはチャネルです。 CSP モデルの鍵は、メッセージを送信するエンティティではなく、チャネルに焦点を当てることです。 Go 言語は CSP 理論の一部を実装しており、Goroutine は CSP 内で同時に実行されるエンティティに相当し、channel は CSP 内のチャネルに相当します。

チャネルの作成

    Go のチャネルでは、キーワードとして
  • chan

    を使用します。

  • chan をバッファリングしないと、相手の準備が整うまで送受信がブロックされます。このメソッドは、ロックや条件変数を使用せずに、ゴロルチンでの同期に使用できます。
  • buffer chan を使用すると、通常は時間をスペースと交換して、ブロックを回避し、アプリケーションのパフォーマンスを向上させることができます。
  • aChan := make(chan int)  // 创建无缓冲chan
    bChan := make(chan int, N) // 创建缓冲为N的chan
  • 代入と値の取得

次のコードからはその大きな役割はわかりませんが、これは正常なことです。これは、通常、2 つのステートメントが一緒になっていないためです。例:

コルーチン A がデータを送信し、コルーチン B がデータを受信します

mchan <- value  // 发送值v到Channel ch中
value := <-mchan // 从Channel ch中接收数据,并将数据赋值给v
Select

Selsect

は、チャネルでデータを取得する最も一般的な方法です。

select 一定程度上可以类比于 linux 中的 IO 多路复用中的 select。后者相当于提供了对多个 IO 事件的统一管理,而 Golang 中的 select 相当于提供了对多个 channel 的统一管理。当然这只是 select 在 channel 上的一种使用方法。

func main(){
    ch1 := make(chan int, 1)
    ch2 := make(chan int, 1)

    select {
        case e1 := <-ch1:
        //如果ch1通道成功读取数据,则执行该case处理语句
            fmt.Printf("1th case is selected. e1=%v",e1)
        case e2 := <-ch2:
        //如果ch2通道成功读取数据,则执行该case处理语句
            fmt.Printf("2th case is selected. e2=%v",e2)
        default:
        //如果上面case都没有成功,则进入default处理流程
            fmt.Println("default!.")
    }
}

for…range

    for …… range语句可以处理Channel。

    go func() {
        time.Sleep(1 * time.Hour)
    }()
    c := make(chan int)
    go func() {
        for i := 0; i < 10; i = i + 1 {
            c <- i
        }
        close(c)
    }()
    for i := range c {
        fmt.Println(i)
    }
    fmt.Println("Finished")

timeout

    Select很重要的一个应用就是超时处理。因为上面提供的demo,select语句就会一直阻塞着。这时候我们可能就需要一个超时操作,用来处理超时的情况。下面这个例子我们会在2秒后往channel c1中发送一个数据,但是Select设置为1秒超时,因此我们会打印出timeout 1,而不是result 1。

    c1 := make(chan string, 1)
    go func() {
        time.Sleep(time.Second * 2)
        c1 <- "result 1"
    }()
    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(time.Second * 1):
        fmt.Println("timeout 1")
    }

close

    Go内建的close方法就可以用来关闭channel。但如果channel 已经被关闭,继续往它发送数据会导致panic: send on closed channel:

 close(mChan)

以上がGo の同時実行性は、ネットワークのない iPhone のようなものですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。