Rumah pembangunan bahagian belakang Golang Kerjasama yang elegan antara Go WaitGroup dan baris gilir mesej

Kerjasama yang elegan antara Go WaitGroup dan baris gilir mesej

Sep 27, 2023 pm 01:17 PM
go baris gilir mesej waitgroup

Go WaitGroup与消息队列的优雅协作

Kerjasama elegan Go WaitGroup dengan baris gilir mesej memerlukan contoh kod khusus

Dalam pembangunan perisian moden, pengaturcaraan serentak merupakan topik yang tidak dapat dielakkan. Terutamanya apabila berurusan dengan data berskala besar dan permintaan serentak yang tinggi, adalah sangat penting untuk mengurus operasi serentak dengan berkesan.

Sebagai bahasa pengaturcaraan serentak yang berkuasa, bahasa Go menyediakan primitif serentak yang kaya untuk membantu pembangun mencapai operasi serentak yang cekap. Antaranya, WaitGroup dan baris gilir mesej digunakan secara meluas untuk melaksanakan mod kerjasama tak segerak.

WaitGroup ialah struktur penting dalam pustaka standard bahasa Go. Ia boleh membantu kami menunggu pelaksanaan kumpulan goroutin selesai. WaitGroup sangat berguna apabila kita memulakan berbilang goroutine dan mahu mereka selesai melaksanakan sebelum meneruskan ke langkah seterusnya.

Proses menunggu sekumpulan goroutine untuk menyelesaikan pelaksanaan boleh dicapai melalui tiga kaedah dalam WaitGroup:

  • Add(n int): Add n waiting goroutine ke WaitGroup.
  • Done(): Kaedah Done() dipanggil selepas setiap goroutine dilaksanakan, menunjukkan bahawa goroutine telah dilaksanakan.
  • Tunggu(): goroutine utama memanggil kaedah Tunggu() untuk menunggu semua goroutine menunggu selesai pelaksanaan.

Berikut ialah contoh kod mudah yang menggunakan WaitGroup untuk melaksanakan fungsi menunggu beberapa goroutin untuk menyelesaikan pelaksanaan:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    
    for i := 0; i < 5; i++ {
        wg.Add(1) // 启动5个goroutine,需要调用5次Add(1)
        go func(i int) {
            defer wg.Done() // 每个goroutine执行完毕后调用Done()
            fmt.Println("goroutine", i, "started")
            time.Sleep(time.Second)
            fmt.Println("goroutine", i, "finished")
        }(i)
    }

    wg.Wait() // 主goroutine等待所有goroutine执行完毕
    fmt.Println("all goroutines finished")
}
Salin selepas log masuk

Dalam kod di atas, kami memberitahu WaitGroup melalui kaedah Tambah WaitGroup bahawa kami mempunyai 5 goroutin untuk menunggu untuk, dan kemudian kaedah Selesai dipanggil selepas setiap goroutine dilaksanakan, dan akhirnya goroutine utama memanggil kaedah Tunggu untuk menunggu semua goroutine dilaksanakan.

Baris gilir mesej ialah satu lagi corak pengaturcaraan serentak yang biasa digunakan, yang sangat mudah apabila mengendalikan tugas tak segerak dan menyahgandingkan komunikasi antara komponen yang berbeza. Baris gilir mesej boleh mengendalikan penjadualan dan pengagihan tugas serentak dengan baik, supaya setiap tugas boleh dilaksanakan mengikut permintaan.

Dalam bahasa Go, kita boleh menggunakan saluran untuk melaksanakan fungsi baris gilir mesej. Berikut ialah contoh kod mudah yang menggunakan saluran untuk melaksanakan fungsi baris gilir mesej:

package main

import "fmt"

func main() {
    tasks := make(chan int) // 创建一个整数类型的channel

    go func() {
        for i := 1; i <= 10; i++ {
            tasks <- i // 把任务发送到channel中
        }
        close(tasks) // 关闭channel,表示没有更多任务了
    }()

    for task := range tasks {
        fmt.Println("processing task", task)
        // 处理任务的逻辑...
    }

    fmt.Println("all tasks finished")
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta saluran jenis integer, dan kemudian menghantar 10 tugasan ke saluran dalam goroutine yang berasingan. Goroutin utama menerima tugasan daripada saluran melalui gelung dan mengendalikan logik tugasan.

Menggabungkan WaitGroup dan baris gilir mesej boleh mencapai corak pengaturcaraan serentak yang lebih kompleks. Contohnya, dalam sistem penjadualan tugas, kita boleh menggunakan WaitGroup untuk menunggu semua tugasan dilaksanakan dan setiap tugas boleh menggunakan baris gilir mesej secara bebas untuk memproses subtugas tertentu.

Berikut ialah contoh kod yang menunjukkan cara menggunakan WaitGroup dan baris gilir mesej untuk bekerjasama bagi penjadualan tugas:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    tasks := make(chan int) // 创建一个整数类型的channel

    wg.Add(1) // 增加1个等待的goroutine
    go func() {
        defer wg.Done() // 当前goroutine执行完毕后调用Done()

        for task := range tasks {
            fmt.Println("processing task", task)
            // 处理任务的逻辑...
            time.Sleep(time.Second)
        }
    }()

    for i := 1; i <= 10; i++ {
        tasks <- i // 把任务发送到channel中
    }
    close(tasks) // 关闭channel,表示没有更多任务了

    wg.Wait() // 等待所有任务执行完毕

    fmt.Println("all tasks finished")
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta saluran jenis integer untuk menerima tugas. Kemudian goroutine dimulakan, di mana tugas diterima dari saluran dan diproses. Goroutine utama bertanggungjawab untuk menghantar tugasan ke saluran dan menunggu selepas semua tugasan telah dilaksanakan.

Melalui kerjasama elegan WaitGroup dan baris gilir mesej, kami boleh mencapai pengaturcaraan serentak yang cekap. WaitGroup boleh membantu kami mengawal susunan pelaksanaan operasi serentak dan menunggu semua tugasan selesai. Barisan mesej boleh merealisasikan penjadualan dinamik dan pengagihan tugas dan pemprosesan tugasan tak segerak. Gabungan kedua-duanya memberikan kami idea dan alatan pengaturcaraan yang lebih serentak, membolehkan kami melaksanakan operasi serentak yang kompleks dengan lebih baik.

Ringkasnya, kerjasama elegan antara Go WaitGroup dan baris gilir mesej memainkan peranan penting dalam pengaturcaraan serentak. Penggunaan yang betul boleh membantu kami mencapai operasi serentak yang cekap dan boleh dipercayai. Sama ada anda berurusan dengan data berskala besar atau permintaan serentak yang tinggi, ia adalah model pengaturcaraan serentak yang sangat berguna.

Atas ialah kandungan terperinci Kerjasama yang elegan antara Go WaitGroup dan baris gilir mesej. 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)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
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)

Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Jun 02, 2024 am 09:00 AM

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Bagaimana untuk menghantar mesej Go WebSocket? Bagaimana untuk menghantar mesej Go WebSocket? Jun 03, 2024 pm 04:53 PM

Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Perbezaan antara bahasa Golang dan Go Perbezaan antara bahasa Golang dan Go May 31, 2024 pm 08:10 PM

Bahasa Go dan Go adalah entiti yang berbeza dengan ciri yang berbeza. Go (juga dikenali sebagai Golang) terkenal dengan kesesuaiannya, kelajuan penyusunan pantas, pengurusan memori dan kelebihan merentas platform. Kelemahan bahasa Go termasuk ekosistem yang kurang kaya berbanding bahasa lain, sintaks yang lebih ketat dan kekurangan penaipan dinamik.

Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Jun 04, 2024 pm 12:27 PM

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Bagaimana untuk menggunakan pembungkus ralat Golang? Bagaimana untuk menggunakan pembungkus ralat Golang? Jun 03, 2024 pm 04:08 PM

Dalam Golang, pembalut ralat membolehkan anda membuat ralat baharu dengan menambahkan maklumat kontekstual kepada ralat asal. Ini boleh digunakan untuk menyatukan jenis ralat yang dilemparkan oleh perpustakaan atau komponen yang berbeza, memudahkan penyahpepijatan dan pengendalian ralat. Langkah-langkahnya adalah seperti berikut: Gunakan fungsi ralat. Balut untuk membalut ralat asal kepada ralat baharu. Ralat baharu mengandungi maklumat kontekstual daripada ralat asal. Gunakan fmt.Printf untuk mengeluarkan ralat yang dibalut, memberikan lebih konteks dan kebolehtindakan. Apabila mengendalikan pelbagai jenis ralat, gunakan fungsi ralat. Balut untuk menyatukan jenis ralat.

Panduan untuk menguji unit fungsi serentak Go Panduan untuk menguji unit fungsi serentak Go May 03, 2024 am 10:54 AM

Unit menguji fungsi serentak adalah penting kerana ini membantu memastikan kelakuan mereka yang betul dalam persekitaran serentak. Prinsip asas seperti pengecualian bersama, penyegerakan dan pengasingan mesti dipertimbangkan semasa menguji fungsi serentak. Fungsi serentak boleh diuji unit dengan mensimulasikan, menguji keadaan perlumbaan dan mengesahkan keputusan.

Bagaimana untuk mencipta Goroutine yang diutamakan dalam Go? Bagaimana untuk mencipta Goroutine yang diutamakan dalam Go? Jun 04, 2024 pm 12:41 PM

Terdapat dua langkah untuk mencipta Goroutine keutamaan dalam bahasa Go: mendaftarkan fungsi penciptaan Goroutine tersuai (langkah 1) dan menentukan nilai keutamaan (langkah 2). Dengan cara ini, anda boleh mencipta Goroutine dengan keutamaan yang berbeza, mengoptimumkan peruntukan sumber dan meningkatkan kecekapan pelaksanaan.

Perkara yang perlu diambil perhatian apabila fungsi Golang menerima parameter peta Perkara yang perlu diambil perhatian apabila fungsi Golang menerima parameter peta Jun 04, 2024 am 10:31 AM

Apabila menghantar peta ke fungsi dalam Go, salinan akan dibuat secara lalai dan pengubahsuaian pada salinan tidak akan menjejaskan peta asal. Jika anda perlu mengubah suai peta asal, anda boleh menghantarnya melalui penuding. Peta kosong perlu dikendalikan dengan berhati-hati, kerana ia secara teknikal adalah penunjuk sifar, dan menghantar peta kosong kepada fungsi yang menjangkakan peta tidak kosong akan menyebabkan ralat.

See all articles