Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ringkasan pengalaman pengaturcaraan serentak Golang: amalan terbaik untuk aplikasi elegan Goroutines

Ringkasan pengalaman pengaturcaraan serentak Golang: amalan terbaik untuk aplikasi elegan Goroutines

王林
王林asal
2023-07-17 22:13:381151semak imbas

Ringkasan Pengalaman Pengaturcaraan Serentak Golang: Amalan Terbaik untuk Aplikasi Elegan Goroutines

Pengenalan:
Dalam era Internet yang sangat serentak hari ini, menulis program selari yang berkesan telah menjadi semakin penting. Golang, sebagai bahasa yang memfokuskan pada pengaturcaraan serentak, menyediakan beberapa alat berkuasa untuk mengendalikan sejumlah besar tugas serentak. Yang paling penting daripada mereka ialah Goroutines.

Goroutines ialah komponen teras model konkurensi Golang, yang membolehkan kami mencipta benang ringan pada kos yang sangat rendah. Dengan menggunakan Goroutines dengan betul, kami boleh menulis program selari dengan elegan dan meningkatkan prestasi dan kebolehpercayaan. Artikel ini akan meringkaskan beberapa amalan terbaik untuk menerapkan Goroutines secara elegan untuk membantu pembaca menguasai pengaturcaraan serentak dengan lebih baik.

1. Konsep asas
Sebelum kita mula, mari kita semak beberapa konsep asas. Goroutine ialah benang ringan Golang mengurus dan menjadualkan Goroutine ini melalui masa jalan. Dengan kata kunci "pergi", kita boleh mencipta Goroutine baharu dalam program ini. Apabila tugas Goroutine selesai, ia akan keluar secara automatik.

2 Cara menggunakan Goroutines
Berikut ialah contoh mudah yang menunjukkan cara menggunakan Goroutines untuk memuat turun berbilang fail pada masa yang sama:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    urls := []string{"https://example.com/file1.txt", "https://example.com/file2.txt", "https://example.com/file3.txt"}

    for _, url := range urls {
        go func(u string) {
            res, err := http.Get(u)
            if err != nil {
                fmt.Println("Error:", err)
                return
            }
            defer res.Body.Close()

            content, err := ioutil.ReadAll(res.Body)
            if err != nil {
                fmt.Println("Error:", err)
                return
            }

            fmt.Printf("Downloaded %s: %d bytes
", u, len(content))
        }(url)
    }

    // 在这里添加等待所有Goroutines完成的逻辑
    // ...

    fmt.Println("All downloads completed")
}

Dalam kod di atas, kami merentasi senarai fail yang perlu dimuat turun melalui untuk gelung, dan dalam setiap Goroutine baharu dicipta menggunakan fungsi tanpa nama dalam gelung kedua. Setiap Goroutine bertanggungjawab untuk memuat turun fail yang sepadan dan mencetak hasil muat turun.

3 Tunggu sehingga semua Goroutine selesai
Dalam aplikasi praktikal, kita biasanya perlu menunggu semua Goroutine selesai sebelum melakukan operasi lain. Nasib baik, Golang menyediakan cara yang mudah dan berkesan untuk mencapai tujuan ini, iaitu menggunakan WaitGroup dalam pakej penyegerakan:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "sync"
)

func main() {
    urls := []string{"https://example.com/file1.txt", "https://example.com/file2.txt", "https://example.com/file3.txt"}
    var wg sync.WaitGroup

    for _, url := range urls {
        wg.Add(1) // 每个Goroutine开始时增加WaitGroup的计数器

        go func(u string) {
            defer wg.Done() // Goroutine完成时减少WaitGroup的计数器

            res, err := http.Get(u)
            if err != nil {
                fmt.Println("Error:", err)
                return
            }
            defer res.Body.Close()

            content, err := ioutil.ReadAll(res.Body)
            if err != nil {
                fmt.Println("Error:", err)
                return
            }

            fmt.Printf("Downloaded %s: %d bytes
", u, len(content))
        }(url)
    }

    wg.Wait() // 等待所有Goroutines完成

    fmt.Println("All downloads completed")
}

Dalam kod di atas, kami menggunakan sync.WaitGroup untuk menyegerakkan semua Goroutines. Pada permulaan setiap Goroutine, kami menambah nilai pembilang melalui wg.Add(1). Pada penghujung Goroutine, kami mengurangkan kaunter dengan menangguhkan wg.Done(). Akhir sekali, kami menggunakan wg.Wait() untuk menyekat utas utama sehingga semua Goroutines selesai.

Ringkasan:
Dalam pengaturcaraan serentak, adalah penting untuk menggunakan Goroutines secara munasabah dan elegan. Melalui reka bentuk konkurensi yang munasabah dan pengurusan sumber yang munasabah, kami boleh meningkatkan prestasi dan kebolehpercayaan program. Artikel ini memperkenalkan beberapa amalan terbaik untuk menerapkan Goroutines secara elegan, dengan harapan dapat membantu pembaca dalam pengaturcaraan serentak Golang.

Atas ialah kandungan terperinci Ringkasan pengalaman pengaturcaraan serentak Golang: amalan terbaik untuk aplikasi elegan Goroutines. 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