Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Komunikasi saluran paip dan amalan serentak goroutine fungsi Golang

Komunikasi saluran paip dan amalan serentak goroutine fungsi Golang

王林
王林asal
2023-05-17 13:00:22957semak imbas

Golang ialah bahasa pengaturcaraan yang cekap dengan keupayaan pengaturcaraan serentak yang sangat berkuasa. Antaranya, komunikasi saluran paip dan goroutine concurrency adalah dua ciri penting Golang. Dalam artikel ini, kami akan memperkenalkan cara menggunakan komunikasi saluran paip dan keselarasan goroutine bagi fungsi Golang untuk mencapai pengaturcaraan yang cekap.

1. Komunikasi Saluran Paip

Komunikasi saluran paip merujuk kepada penggunaan paip untuk menyampaikan data di Golang. Pengeluar dalam program menulis data ke paip, dan pengguna membaca data dari paip Pertukaran data antara goroutine yang berbeza direalisasikan melalui paip. Untuk paip, terdapat dua jenis: buffered dan unbuffered.

Paip penimbal tidak perlu menunggu bacaan semasa menulis data, tetapi menyimpan data dalam paip buat sementara waktu dan tunggu sehingga tiada data dalam paip sebelum membaca. Apabila terdapat data cache dalam saluran paip, anda boleh menggunakan pernyataan pilih untuk melaksanakan operasi baca dan tulis tanpa sekatan. Paip tidak buffer memerlukan tulisan dan bacaan untuk digandingkan, iaitu, tulis tunggu sehingga bacaan berlaku.

Berikut ialah contoh kod yang menggambarkan cara menggunakan paip untuk melaksanakan komunikasi antara pengeluar dan pengguna:

func main() {

ch := make(chan int)  // 创建一个整型管道
go producer(ch)       // 启动生产者函数
consumer(ch)          // 启动消费者函数

}

// Fungsi pengeluar, menulis data ke paip
func producer(ch chan int) {

for i := 0; i < 10; i++ {
    ch <- i  // 将数据写入管道
}
close(ch)  // 关闭管道

}

// Fungsi pengguna, membaca daripada data paip
func consumer (ch chan int) {

for {
    // 非阻塞式读取管道数据
    select {
    case num, ok := <-ch:  // 获取管道的值
        if ok {
            fmt.Println("Consumer received", num)  // 打印数据
        } else {
            fmt.Println("Channel closed")
            return  // 退出函数
        }
    default:
        // 没有读取到管道数据,进行其他操作
        time.Sleep(time.Second)
    }
}

}

Dalam contoh ini, fungsi pengeluar terus menulis data melalui paip. Fungsi pengguna membaca data daripada paip melalui penyataan pilih, yang merupakan operasi baca tanpa menyekat. Jika terdapat data dalam saluran paip, kod dalam pernyataan kes akan dilaksanakan, jika tidak, pernyataan lalai akan dilaksanakan untuk melaksanakan operasi lain.

2. Goroutine concurrency

Groutine di Golang ialah benang ringan yang boleh berjalan serentak dengan goroutine lain. Penciptaan dan pengendalian goroutine adalah sangat cekap dan boleh meningkatkan keupayaan serentak program.

Di Golang, anda boleh memulakan goroutine baharu melalui kata kunci go. Apabila terdapat berbilang goroutine dalam program, pertukaran data dan operasi penyegerakan boleh dilakukan melalui saluran dan kaedah lain untuk mencapai pengaturcaraan serentak yang cekap.

Berikut ialah contoh kod yang menggambarkan cara menggunakan goroutine untuk melaksanakan operasi serentak:

func main() {

ch := make(chan int)  // 创建一个整型管道
for i := 0; i < 10; i++ {
    go doWork(i, ch)  // 启动10个goroutine
}
for i := 0; i < 10; i++ {
    <-ch  // 阻塞式从管道中读取数据
}
close(ch)  // 关闭管道

}

// Untuk setiap Kerja dengan integer
func doWork(i int, ch chan int) {

fmt.Println("Doing work", i)
time.Sleep(time.Second)  // 休眠1秒
ch <- i                  // 写入整型数到管道

}

Dalam contoh ini, kami mencipta 10 goroutin baharu melalui kata kunci go , dan melakukan operasi percetakan dan 1 saat tidur dalam setiap goroutine. Selepas setiap goroutine menyelesaikan operasinya, integer yang sepadan akan ditulis pada paip. Dalam fungsi utama, kami menggunakan bacaan menyekat untuk membaca 10 integer daripada paip untuk memastikan setiap goroutine telah menyelesaikan operasi.

Ringkasan

Di Golang, komunikasi saluran paip dan goroutine concurrency adalah dua ciri penting untuk mencapai pengaturcaraan yang cekap. Melalui komunikasi saluran paip, kami boleh bertukar-tukar data antara gorouti yang berbeza untuk mencapai penyahgandingan program dan pelaksanaan serentak. Pada masa yang sama, melalui goroutine concurrency, kami boleh melaksanakan pelbagai tugas pada masa yang sama dan meningkatkan kecekapan pelaksanaan program.

Perlu diperhatikan bahawa apabila menggunakan komunikasi saluran paip dan goroutine concurrency, anda perlu memberi perhatian kepada isu persaingan data. Semasa pelaksanaan serentak, gorouti yang berbeza boleh mengakses pembolehubah yang sama pada masa yang sama Kita perlu menggunakan operasi atom atau kunci mutex Golang untuk melaksanakan operasi serentak.

Saya harap artikel ini dapat membantu anda lebih memahami penggunaan komunikasi saluran paip dan goroutine concurrency dan mengaplikasikannya dalam amalan.

Atas ialah kandungan terperinci Komunikasi saluran paip dan amalan serentak goroutine fungsi 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