Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara memilih untuk menggunakan Saluran penimbal atau tidak penimbal di Golang

Cara memilih untuk menggunakan Saluran penimbal atau tidak penimbal di Golang

PHPz
PHPzasal
2023-08-07 15:25:471071semak imbas

Golang 中如何选择使用缓冲或非缓冲 Channels

Cara memilih untuk menggunakan Saluran penimbal atau tidak penimbal dalam Golang

Dalam bahasa Go, Channel ialah mekanisme yang digunakan untuk komunikasi antara Goroutines. Apabila menggunakan Saluran, kita perlu memilih untuk menggunakan Saluran penimbal atau tidak penimbal. Artikel ini akan memperkenalkan bila anda harus memilih untuk menggunakan Saluran penimbal dan bila anda harus memilih untuk menggunakan Saluran tidak penimbal dan memberikan contoh kod yang sepadan.

  1. Saluran Bukan Penimbalan

Saluran Bukan Penimbalan bermaksud apabila menghantar data, pengirim akan disekat sehingga Goroutine menerima data tersebut. Begitu juga, apabila menerima data, penerima akan disekat sehingga Goroutine menghantar data. Contoh kod Saluran bukan penimbal adalah seperti berikut:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    go func() {
        time.Sleep(time.Second)
        ch <- 1 // 发送数据到Channel
        fmt.Println("数据已发送")
    }()

    fmt.Println("等待数据中...")
    data := <-ch // 接收Channel中的数据
    fmt.Println("接收到数据:", data)
}

Dalam contoh ini, kami mencipta Saluran bukan penimbal ch. Dalam Goroutine tanpa nama, kami menunggu selama 1 saat dan kemudian menghantar data 1 ke Saluran. Tunggu data dalam Goroutine utama dan cetaknya selepas menerima data. Disebabkan penggunaan Saluran tidak buffer, operasi penghantaran data akan menyekat Goroutine utama sehingga data diterima sebelum pelaksanaan boleh diteruskan. ch。在匿名Goroutine中,我们等待1秒钟,然后将数据1发送到Channel中。在主Goroutine中等待数据,并接收到数据后打印出来。由于使用了非缓冲Channel,发送数据的操作会阻塞主Goroutine,直到数据被接收后才能继续执行。

当我们需要确保发送和接收的顺序时,或者需要同步两个Goroutine之间的操作时,非缓冲Channel是一个很好的选择。

  1. 缓冲Channel

缓冲Channel是指在发送数据时,如果Channel的缓冲区未满,则发送方不会被阻塞。同样地,在接收数据时,如果Channel的缓冲区非空,则接收方不会被阻塞。缓冲Channel的代码示例如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 1) // 创建一个容量为1的缓冲Channel

    go func() {
        time.Sleep(time.Second)
        ch <- 1 // 发送数据到Channel
        fmt.Println("数据已发送")
    }()

    fmt.Println("等待数据中...")
    time.Sleep(2 * time.Second) // 等待一段时间,确保Goroutine有足够的时间发送数据
    data := <-ch                // 接收Channel中的数据
    fmt.Println("接收到数据:", data)
}

在这个例子中,我们创建了一个容量为1的缓冲Channel ch

Saluran Tidak Buffer ialah pilihan yang baik apabila kita perlu memastikan susunan penghantaran dan penerimaan, atau apabila kita perlu menyegerakkan operasi antara dua Goroutine.

    Saluran Penampan

    Saluran Penampan bermaksud apabila menghantar data, jika penimbal Saluran tidak penuh, pengirim tidak akan disekat. Begitu juga, apabila menerima data, jika penimbal Saluran tidak kosong, penerima tidak akan disekat. Contoh kod bagi Saluran penimbal adalah seperti berikut:

    rrreee

    Dalam contoh ini, kami mencipta Saluran penimbal ch dengan kapasiti 1. Dalam Goroutine tanpa nama, kami menunggu selama 1 saat dan kemudian menghantar data 1 ke Saluran. Tunggu beberapa lama dalam Goroutine utama untuk memastikan Goroutine mempunyai masa yang mencukupi untuk menghantar data, kemudian terima data dan cetaknya. Disebabkan penggunaan Saluran buffer, operasi penghantaran data tidak akan menyekat Goroutine utama.

    Apabila kami menghantar data dan tidak mahu penghantar disekat, atau kami ingin mengurangkan masa menunggu antara Goroutines, Saluran penimbal ialah pilihan yang baik.

    🎜Ringkasan: 🎜🎜Apabila memilih untuk menggunakan Saluran penimbal atau tidak penimbal, anda boleh membuat pertimbangan berdasarkan sama ada anda perlu menyegerakkan operasi Goroutine. Jika anda perlu memastikan susunan penghantaran dan penerimaan atau perlu menyegerakkan operasi antara dua Goroutines, anda boleh memilih untuk menggunakan Saluran tidak buffer jika anda tidak mahu pengirim disekat atau ingin mengurangkan masa menunggu antara Goroutines; , anda boleh memilih untuk menggunakan Saluran penimbal. 🎜🎜Perlu diingat bahawa apabila menggunakan Saluran tidak buffer, penghantar dan penerima mesti bersedia pada masa yang sama, jika tidak kebuntuan akan berlaku. Oleh itu, apabila menggunakan Saluran bukan penimbal, isu penyegerakan antara Goroutines perlu dipertimbangkan dengan teliti. 🎜🎜Dengan memilih Saluran buffer atau bukan buffer secara rasional, kami boleh menggunakan ciri konkurensi yang disediakan oleh bahasa Go dengan lebih baik untuk mencapai komunikasi dan penyegerakan yang cekap antara Goroutines. 🎜

Atas ialah kandungan terperinci Cara memilih untuk menggunakan Saluran penimbal atau tidak penimbal di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn