Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan pengaturcaraan serentak Select Channels Go yang lebih fleksibel melalui golang

Laksanakan pengaturcaraan serentak Select Channels Go yang lebih fleksibel melalui golang

王林
王林asal
2023-09-28 13:45:02658semak imbas

通过golang实现更加灵活的Select Channels Go并发式编程

Mencapai Saluran Pilih yang lebih fleksibel Go pengaturcaraan serentak melalui golang

Pengenalan:
Bahasa Go digemari oleh pembangun kerana sintaksnya yang ringkas dan ciri konkurensi yang berkuasa. Antaranya, dengan menggabungkan saluran dan penyata terpilih, kami boleh mencapai pengaturcaraan serentak yang cekap dan fleksibel. Artikel ini akan memperkenalkan cara melaksanakan pengaturcaraan serentak Select Channels Go yang lebih fleksibel melalui golang melalui contoh kod tertentu.

1 Apakah penyata dan Saluran Pilih?
Sebelum memperkenalkan pengaturcaraan serentak Select Channels Go yang fleksibel, mari kita fahami konsep kenyataan dan saluran terpilih.

1.1 Penyataan pilih
Pernyataan pilih ialah pernyataan kawalan aliran dalam bahasa Go, digunakan untuk memilih antara berbilang operasi saluran. Ia boleh digunakan untuk memantau aliran data berbilang saluran dan melaksanakan operasi yang sepadan apabila terdapat data yang boleh dibaca atau ditulis dalam mana-mana satu saluran.

1.2 Saluran
Saluran ialah jenis khas dalam bahasa Go yang digunakan untuk komunikasi dalam persekitaran serentak. Ia boleh digunakan untuk memindahkan data antara goroutine yang berbeza untuk mencapai penyelarasan dan penyegerakan.

2. Saluran Pilih Fleksibel Pergi pengaturcaraan serentak

2.1 Saluran Pilih Asas Pergi pengaturcaraan serentak
Pertama, mari kita lihat contoh mudah untuk menunjukkan cara melaksanakan pengaturcaraan serentak asas melalui saluran dan penyataan pilih.

package main

import (
    "fmt"
    "time"
)

func printer(c chan string) {
    for {
        msg := <-c
        fmt.Println(msg)
        time.Sleep(time.Second)
    }
}

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

    go printer(c1)
    go printer(c2)

    for i := 0; i < 5; i++ {
        c1 <- "Hello"
        c2 <- "World"
        time.Sleep(time.Second)
    }
}

Dalam kod di atas, kami mencipta dua saluran jenis rentetan c1 dan c2, dan kemudian memulakan goroutine kedua-dua fungsi pencetak masing-masing. Dalam fungsi utama, kami menghantar data ke dua fungsi pencetak melalui c1 dan c2. Dalam fungsi pencetak, dua saluran dipantau melalui pernyataan pilih Setelah data boleh dibaca dalam salah satu saluran, operasi pencetakan yang sepadan dilakukan.

2.2 Pilih Saluran Pergi pengaturcaraan serentak dengan fungsi tamat masa
Dalam contoh di atas, kami menggunakan masa.Sleep untuk mensimulasikan operasi tertunda. Walau bagaimanapun, dalam pengaturcaraan serentak sebenar, kita sering perlu menangani situasi tamat masa.

package main

import (
    "fmt"
    "time"
)

func printer(c chan string) {
    for {
        select {
        case msg := <-c:
            fmt.Println(msg)
        case <-time.After(time.Second * 3):
            fmt.Println("Timeout")
        }
    }
}

func main() {
    c := make(chan string)

    go printer(c)

    c <- "Hello"
    time.Sleep(time.Second * 2)
}

Dalam kod di atas, kami mengubah suai fungsi pencetak dan menambah pernyataan pilih. Dalam penyataan pilih, kami menggunakan fungsi masa. Selepas untuk mencipta saluran dengan fungsi tamat masa. Jika tiada data diterima daripada c dalam masa 3 saat, operasi pencetakan tamat masa dilakukan.

2.3 Saluran Pilih Pergi Pengaturcaraan Serentak dengan Keadaan Lalai
Kadangkala, kita mungkin perlu menambah syarat lalai pada pernyataan pilihan untuk mengelakkan penyekatan program.

package main

import (
    "fmt"
    "time"
)

func printer(c1 chan string, c2 chan string) {
    for {
        select {
        case msg := <-c1:
            fmt.Println(msg)
        case msg := <-c2:
            fmt.Println(msg)
        default:
            fmt.Println("No data received")
            time.Sleep(time.Second)
        }
    }
}

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

    go printer(c1, c2)

    time.Sleep(time.Second * 2)
}

Dalam kod di atas, kami mengubah suai fungsi pencetak dan menambah cawangan lalai. Apabila tiada data diterima, "Tiada data diterima" dicetak secara lalai.

Kesimpulan:
Melalui penyataan dan saluran terpilih dalam golang, kami boleh dengan mudah melaksanakan pengaturcaraan serentak yang cekap dan fleksibel. Melalui contoh di atas, kita boleh memahami cara menggunakan kenyataan dan saluran terpilih pada asasnya, dan cara menambah tamat masa dan syarat lalai. Melalui teknik ini, kita boleh menulis program serentak yang cekap dan mantap.

Latihan ialah cara terbaik untuk meningkatkan kemahiran anda, saya menggalakkan anda untuk cuba menulis lebih banyak kod sendiri dan menjadi mahir dalam penggunaan kenyataan dan saluran terpilih melalui latihan. Hanya dengan latihan berterusan kita boleh benar-benar menguasai intipati pengaturcaraan serentak.

Saya harap artikel ini akan membantu anda memahami dan menggunakan golang untuk mencapai pengaturcaraan serentak Select Channels Go yang lebih fleksibel!

Atas ialah kandungan terperinci Laksanakan pengaturcaraan serentak Select Channels Go yang lebih fleksibel melalui 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