Rumah pembangunan bahagian belakang Golang Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama di Golang

Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama di Golang

Aug 07, 2023 pm 02:25 PM
channels Operasi baca dan tulis golang coroutine

Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama dalam pengaturcaraan Golang

In Go, goroutine digunakan secara meluas untuk mencapai keselarasan dan selari. Saluran ialah struktur data khas yang digunakan untuk komunikasi dan penyegerakan antara coroutine. Saluran menyediakan cara yang selamat untuk berkongsi data antara coroutine.

Dalam sesetengah kes, kita mungkin memerlukan berbilang coroutine untuk membaca atau menulis Saluran yang sama pada masa yang sama. Oleh kerana Saluran menyekat secara lalai, jika langkah khas tidak diambil, berbilang coroutine akan menyekat satu sama lain, menyebabkan program gagal berjalan seperti biasa. Seterusnya, saya akan membincangkan dua penyelesaian biasa.

Penyelesaian 1: Gunakan Saluran penimbal

Saluran Penampan ialah saluran dengan kapasiti terhad. Apabila membuat Saluran, kami boleh menentukan kapasitinya. Apabila penimbal Saluran tidak penuh, operasi tulis boleh diselesaikan serta-merta apabila penimbal tidak kosong, operasi baca juga boleh selesai dengan serta-merta. Baca dan tulis blok operasi hanya apabila penimbal penuh atau kosong.

Berikut ialah contoh kod:

package main

import (
    "fmt"
    "time"
)

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

    // 启动多个协程,并同时写入 Channel
    for i := 1; i <= 5; i++ {
        go func(i int) {
            ch <- i
            fmt.Printf("协程 %d 写入数据
", i)
        }(i)
    }

    // 读取 Channel 中的数据
    time.Sleep(time.Second) // 休眠 1 秒,等待协程写入数据
    for i := 1; i <= 5; i++ {
        fmt.Printf("读取到数据:%d
", <-ch)
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta Saluran penimbal ch dengan kapasiti 1. Kemudian 5 coroutine dimulakan dan mereka menulis data ke Saluran ch pada masa yang sama. Oleh kerana Saluran ditimbal, penulisan selesai serta-merta. Akhir sekali, kami mengulangi data dalam Saluran dan melaksanakan operasi baca. ch。然后启动了 5 个协程,它们同时向 Channel ch 写入数据。由于 Channel 是缓冲的,所以写入操作可以立即完成。最后,我们遍历 Channel 中的数据,并进行读取操作。

解决方案二:使用带有 select 语句的无缓冲 Channel

无缓冲 Channel 是一种没有容量的 Channel。在这种情况下,读取和写入操作都会阻塞,直到有另一个协程执行相反的操作。但我们可以使用 select 语句来实现同时读写无缓冲 Channel,避免协程相互阻塞。

下面是一个示例代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建无缓冲 Channel
    ch := make(chan int)

    // 启动多个协程,并同时写入 Channel
    for i := 1; i <= 5; i++ {
        go func(i int) {
            select {
            case ch <- i:
                fmt.Printf("协程 %d 写入数据
", i)
            default:
                fmt.Printf("协程 %d 无法写入数据
", i)
            }
        }(i)
    }

    // 读取 Channel 中的数据
    time.Sleep(time.Second) // 休眠 1 秒,等待协程写入数据
    for i := 1; i <= 5; i++ {
        select {
        case data := <-ch:
            fmt.Printf("读取到数据:%d
", data)
        default:
            fmt.Println("无法读取数据")
        }
    }
}
Salin selepas log masuk

上述代码中,我们创建了一个无缓冲 Channel ch。与解决方案一不同的是,在写入数据时我们使用了 select 语句,并在 case 中处理写入成功和失败的情况。相同地,在读取数据时我们也使用了 select

Penyelesaian 2: Gunakan Saluran yang tidak ditimbal dengan pernyataan pilihan

Saluran yang tidak ditimbal ialah Saluran tanpa kapasiti. Dalam kes ini, kedua-dua operasi baca dan tulis blok sehingga coroutine lain melakukan operasi bertentangan. Tetapi kita boleh menggunakan pernyataan select untuk membaca dan menulis Saluran yang tidak ditimbal pada masa yang sama untuk mengelakkan coroutine menyekat satu sama lain.

Berikut ialah contoh kod:

rrreee

Dalam kod di atas, kami mencipta Saluran ch yang tidak dibuffer. Perbezaan daripada penyelesaian satu ialah kami menggunakan pernyataan select semasa menulis data dan mengendalikan kejayaan dan kegagalan penulisan dalam case. Begitu juga, kami juga menggunakan pernyataan select semasa membaca data untuk mengendalikan situasi di mana data tidak boleh dibaca. 🎜🎜Ringkasan: 🎜🎜Dengan menggunakan Saluran penimbal atau Saluran tidak penimbal dengan penyataan pilihan, kita boleh mencapai berbilang coroutine membaca dan menulis Saluran yang sama pada masa yang sama. Penyelesaian ini boleh meningkatkan kecekapan program anda dan mengelakkan coroutine menghalang satu sama lain. 🎜🎜Sudah tentu, sebagai tambahan kepada penyelesaian di atas, terdapat teknik pengaturcaraan serentak yang lebih maju, seperti menggunakan WaitGroup, Mutex, dll. Dalam aplikasi sebenar, kita perlu memilih mekanisme kawalan konkurensi yang sesuai berdasarkan keperluan khusus. Saya harap artikel ini dapat membantu anda lebih memahami dan menggunakan pengaturcaraan serentak di Golang. 🎜

Atas ialah kandungan terperinci Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Operasi membaca dan menulis fail binari dalam PHP Operasi membaca dan menulis fail binari dalam PHP Jun 22, 2023 am 09:09 AM

PHP ialah bahasa yang digunakan secara meluas dalam pembangunan web Ia menyediakan banyak fungsi dan kaedah untuk memproses fail. Dalam PHP, kita boleh menggunakan mod binari untuk membaca dan menulis fail Kaedah ini boleh meningkatkan kecekapan operasi fail, terutamanya apabila memproses fail binari. Dalam artikel ini, kami akan meneroka operasi membaca dan menulis fail binari dalam PHP dan cara menggunakan kaedah ini untuk memproses fail binari. Apakah fail binari? Fail binari merujuk kepada fail yang diwakili oleh binari tulen, dan kandungannya mungkin mengandungi set aksara yang dikodkan yang berbeza.

Kaedah pemprosesan tak segerak bagi pengaturcaraan serentak Select Channels Go menggunakan golang Kaedah pemprosesan tak segerak bagi pengaturcaraan serentak Select Channels Go menggunakan golang Sep 28, 2023 pm 05:27 PM

Kaedah pemprosesan tak segerak bagi pengaturcaraan serentak SelectChannelsGo menggunakan golang Pengenalan: Pengaturcaraan serentak ialah bidang penting dalam pembangunan perisian moden, yang boleh meningkatkan prestasi dan responsif aplikasi dengan berkesan. Dalam bahasa Go, pengaturcaraan serentak boleh dilaksanakan dengan mudah dan cekap menggunakan penyataan Saluran dan Pilih. Artikel ini akan memperkenalkan cara menggunakan golang untuk kaedah pemprosesan tak segerak bagi pengaturcaraan serentak SelectChannelsGo dan menyediakan khusus

Contoh penggunaan OpenCSV untuk membaca dan menulis fail CSV dalam Java Contoh penggunaan OpenCSV untuk membaca dan menulis fail CSV dalam Java Dec 20, 2023 am 09:57 AM

Contoh membaca dan menulis fail CSV dalam Java menggunakan OpenCSV Pengenalan: CSV (Comma-SeparatedValues) ialah format fail teks biasa, biasanya digunakan untuk menyimpan data jadual. Di Java, OpenCSV ialah perpustakaan sumber terbuka yang popular yang boleh digunakan untuk mengendalikan pembacaan dan penulisan fail CSV. Artikel ini akan memperkenalkan cara menggunakan OpenCSV untuk membaca dan menulis fail CSV, termasuk membaca dan menghuraikan fail CSV dan fail CSV

PHP melaksanakan operasi membaca dan menulis fail Word PHP melaksanakan operasi membaca dan menulis fail Word Jun 18, 2023 pm 02:28 PM

Dalam era Internet, penyuntingan dokumen telah menjadi bahagian yang sangat diperlukan dalam kehidupan dan pekerjaan harian orang ramai. Dokumen Word adalah salah satu format fail paling biasa yang hampir semua orang telah gunakan. Dalam proses amalan pembangunan, kita biasanya perlu membaca dan menulis dokumen Word untuk memenuhi keperluan yang berbeza Jadi bagaimana untuk menggunakan PHP untuk merealisasikan operasi membaca dan menulis fail Word? 1. Pengenalan kepada fail Word Fail Word ialah format fail teks yang dibangunkan oleh Microsoft, dengan sambungan ".do"

PHP melaksanakan operasi membaca dan menulis fail CSV PHP melaksanakan operasi membaca dan menulis fail CSV Jun 18, 2023 pm 03:52 PM

PHP ialah bahasa pengaturcaraan yang sangat popular, mudah dipelajari dan mudah digunakan dengan banyak ciri berkuasa. Dalam kerja sebenar, kita selalunya perlu memproses fail CSV PHP menyediakan banyak fungsi dan kelas yang mudah untuk melaksanakan operasi membaca dan menulis fail CSV. Artikel ini akan memperkenalkan cara menggunakan fungsi dan kelas ini dalam PHP untuk memproses fail CSV. Membaca fail CSV PHP menyediakan fungsi fgetcsv() untuk membaca kandungan fail CSV. Sintaks fungsi ini adalah seperti berikut: fgetcsv(

Kaedah kawalan perintah pelaksanaan Goroutine dan Saluran di Golang Kaedah kawalan perintah pelaksanaan Goroutine dan Saluran di Golang Aug 09, 2023 am 09:06 AM

Kaedah kawalan jujukan pelaksanaan Goroutine dan Saluran di Golang Dalam pengaturcaraan Golang, Goroutine dan Saluran adalah dua konsep yang sangat penting. Goroutine ialah benang ringan yang boleh menjalankan pelbagai fungsi secara serentak semasa pelaksanaan program. Saluran ialah mekanisme yang digunakan untuk komunikasi antara Goroutines. Dalam beberapa kes kita perlu mengawal Gorouti

Petua dan perangkap untuk menggunakan Saluran Golang Petua dan perangkap untuk menggunakan Saluran Golang Aug 09, 2023 pm 06:45 PM

Petua dan perangkap untuk menggunakan GolangChannels Pengenalan: Golang ialah bahasa pembangunan yang sangat popular dengan model konkurensinya dan konsep saluran membolehkan pembangun memproses tugas secara serentak. Artikel ini akan membincangkan petua penggunaan dan beberapa masalah biasa GolangChannels untuk membantu pembaca menulis kod yang lebih mantap dan boleh diselenggara. 1. Konsep asas Saluran Di Golang, Saluran digunakan dalam

Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama di Golang Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama di Golang Aug 07, 2023 pm 02:25 PM

Cara melaksanakan berbilang coroutine untuk membaca dan menulis Saluran yang sama pada masa yang sama dalam pengaturcaraan Golang, goroutine digunakan secara meluas untuk mencapai keselarasan dan selari. Saluran ialah struktur data khas yang digunakan untuk komunikasi dan penyegerakan antara coroutine. Saluran menyediakan cara yang selamat untuk berkongsi data antara coroutine. Dalam sesetengah kes, kami mungkin memerlukan berbilang coroutine untuk membaca atau menulis ke Saluran yang sama pada masa yang sama. Kerana Channel

See all articles