Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan Serentak yang Cekap: Petua Praktikal untuk Menggunakan Golang WaitGroup

Pengaturcaraan Serentak yang Cekap: Petua Praktikal untuk Menggunakan Golang WaitGroup

王林
王林asal
2023-09-27 17:48:37774semak imbas

高效并发编程:使用Golang WaitGroup的实践技巧

Pengaturcaraan serentak yang cekap: kemahiran praktikal menggunakan Golang WaitGroup

Pengenalan: Dalam bidang pembangunan perisian hari ini, pengaturcaraan serentak adalah kemahiran yang sangat penting. Sebagai bahasa pengaturcaraan berprestasi tinggi, Golang menyediakan mekanisme dan alatan pengaturcaraan serentak yang kaya. Antaranya, WaitGroup ialah alat yang sangat praktikal untuk penyegerakan benang di Golang. Dalam artikel ini, kami akan meneroka cara menggunakan WaitGroup untuk pengaturcaraan serentak yang cekap dan menyediakan beberapa kod contoh praktikal.

1. Fahami WaitGroup

Sebelum bermula, mari kita fahami dahulu apa itu WaitGroup. WaitGroup ialah primitif serentak di Golang yang boleh digunakan untuk menunggu kumpulan gorout menyelesaikan tugasan. Ringkasnya, WaitGroup boleh membantu kami meneruskan ke langkah seterusnya selepas semua gorout menyelesaikan tugas mereka.

2. Kaedah asas menggunakan WaitGroup

Terdapat tiga kaedah asas menggunakan WaitGroup: Tambah, Selesai dan Tunggu.

  1. Tambah kaedah: Digunakan untuk memberitahu WaitGroup berapa banyak goroutine yang masih perlu kita tunggu. Parameter kaedah Tambah adalah jenis int, menunjukkan bilangan goroutin menunggu.
  2. Kaedah selesai: digunakan untuk memberitahu WaitGroup bahawa goroutine telah menyelesaikan tugasnya. Setiap kali kaedah Selesai dipanggil, bilangan goroutin menunggu akan dikurangkan sebanyak satu.
  3. Kaedah tunggu: digunakan untuk menunggu semua goroutine menyelesaikan tugas mereka. Apabila bilangan goroutine menunggu dikurangkan kepada 0, kaedah Tunggu akan kembali.

3. Kemahiran praktikal

Seterusnya, kami akan menggunakan beberapa kod sampel sebenar untuk menunjukkan cara menggunakan WaitGroup untuk pengaturcaraan serentak yang cekap.

Contoh 1: Tugasan serentak yang mudah

Andaikan kita mempunyai senarai tugasan, perlu melaksanakan tugasan secara selari, dan tunggu semua tugasan dilaksanakan untuk mencetak keputusan. Fungsi ini boleh dilaksanakan dengan mudah menggunakan WaitGroup.

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    tasks := []string{"task1", "task2", "task3", "task4"}

    for _, t := range tasks {
        wg.Add(1)
        go func(task string) {
            defer wg.Done()

            // 执行任务,这里假设执行耗时为1秒
            // ...

            fmt.Printf("任务 %s 执行完毕
", task)
        }(t)
    }

    wg.Wait()

    fmt.Println("所有任务执行完毕!")
}

Dalam contoh di atas, kami mula-mula mencipta wg instance WaitGroup. Kemudian, dengan menggelung senarai tugas, gunakan kaedah Tambah untuk memberitahu WaitGroup bahawa terdapat goroutine untuk menunggu. Seterusnya, kami memulakan coroutine untuk melaksanakan tugas, dan menggunakan kaedah Selesai untuk memberitahu WaitGroup bahawa goroutine telah selesai selepas tugasan dilaksanakan. Akhir sekali, panggil kaedah Tunggu untuk menunggu semua goroutine menyelesaikan pelaksanaan.

Contoh 2: Muat turun serentak

Dalam contoh ini, kita perlu memuat turun berbilang fail pada masa yang sama dan mengagregatkan hasil selepas semua fail dimuat turun. Fungsi ini boleh dilaksanakan dengan mudah menggunakan WaitGroup.

package main

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

func main() {
    var wg sync.WaitGroup

    urls := []string{"http://example.com/file1.txt", "http://example.com/file2.txt", "http://example.com/file3.txt"}

    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()

            resp, err := http.Get(url)
            if err != nil {
                fmt.Printf("下载 %s 失败:%s
", url, err.Error())
                return
            }

            defer resp.Body.Close()

            body, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                fmt.Printf("读取 %s 内容失败:%s
", url, err.Error())
                return
            }

            fmt.Printf("下载 %s 完成,文件大小:%d 字节
", url, len(body))
        }(url)
    }

    wg.Wait()

    fmt.Println("所有文件下载完成!")
}

Dalam contoh di atas, kami juga menggunakan WaitGroup untuk melaksanakan muat turun serentak. Dengan menggelung senarai alamat muat turun, gunakan kaedah Tambah untuk memberitahu WaitGroup bahawa terdapat goroutine yang perlu ditunggu. Dalam setiap goroutine, kami menggunakan pakej http untuk menghantar permintaan GET dan mendapatkan kandungan fail. Akhir sekali, gunakan kaedah Selesai untuk memberitahu WaitGroup bahawa goroutine telah selesai. Akhir sekali, panggil kaedah Tunggu untuk menunggu semua goroutine menyelesaikan pelaksanaan.

Kesimpulan: Artikel ini memperkenalkan cara menggunakan WaitGroup Golang untuk mencapai pengaturcaraan serentak yang cekap. Dengan menggunakan kaedah Tambah, Selesai dan Tunggu dengan betul, kami boleh mengawal proses pelaksanaan tugas serentak dengan mudah dan meningkatkan prestasi dan kecekapan program. Apabila anda menulis program serentak, anda juga boleh cuba menggunakan WaitGroup untuk menyegerakkan tugasan. Saya percaya ia akan memberi anda banyak kemudahan dan kejutan.

Atas ialah kandungan terperinci Pengaturcaraan Serentak yang Cekap: Petua Praktikal untuk Menggunakan Golang WaitGroup. 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