Rumah >pembangunan bahagian belakang >Golang >Pemprosesan tugas berskala besar: menggunakan Golang WaitGroup dan kumpulan coroutine

Pemprosesan tugas berskala besar: menggunakan Golang WaitGroup dan kumpulan coroutine

PHPz
PHPzasal
2023-09-28 16:21:061395semak imbas

大规模任务处理:使用Golang WaitGroup和协程池

Pemprosesan tugasan berskala besar: menggunakan Golang WaitGroup dan kumpulan coroutine

Dengan perkembangan teknologi dan peningkatan populariti aplikasi Internet, pemprosesan tugasan berskala besar telah menjadi cabaran yang dihadapi oleh banyak pembangun perisian. Dalam artikel ini, kami akan memperkenalkan cara menggunakan WaitGroup dan kumpulan coroutine Golang untuk mengendalikan tugas berskala besar dengan cekap dan memberikan contoh kod khusus.

Pertama, mari kita perkenalkan secara ringkas WaitGroup dan kumpulan coroutine di Golang.

WaitGroup ialah alat penyegerakan benang yang disediakan dalam pustaka standard Golang, yang boleh digunakan untuk menunggu tamatnya kumpulan coroutine. WaitGroup mempunyai tiga kaedah: Tambah, Selesai dan Tunggu. Tetapkan bilangan coroutine menunggu dengan memanggil kaedah Tambah Setiap coroutine memanggil kaedah Selesai pada penghujung, dan coroutine utama menunggu semua coroutine selesai dengan memanggil kaedah Tunggu.

Kolam coroutine ialah teknologi yang digunakan untuk menguruskan coroutine. Ia mengelakkan masalah pendudukan sumber sistem yang berlebihan dengan mengehadkan bilangan coroutine yang dilaksanakan secara serentak. Kumpulan coroutine biasanya mengekalkan baris gilir tugas dan memproses tugasan dengan menggunakan semula coroutine yang telah dibuat.

Berikut ialah contoh kod yang menggunakan WaitGroup dan kumpulan coroutine untuk mengendalikan tugasan berskala besar:

package main

import (
    "fmt"
    "sync"
)

type Task struct {
    Id int
}

func processTask(task Task) {
    // 模拟处理任务的过程
    fmt.Printf("Processing task %d
", task.Id)
}

func worker(tasks <-chan Task, wg *sync.WaitGroup) {
    defer wg.Done()

    for task := range tasks {
        processTask(task)
    }
}

func main() {
    numWorkers := 5
    numTasks := 20

    var wg sync.WaitGroup
    tasks := make(chan Task)

    wg.Add(numWorkers)

    // 创建协程池
    for i := 0; i < numWorkers; i++ {
        go worker(tasks, &wg)
    }

    // 将任务添加到任务队列中
    for i := 0; i < numTasks; i++ {
        tasks <- Task{Id: i + 1}
    }

    close(tasks)

    wg.Wait()
}

Dalam kod di atas, kami mentakrifkan struktur Tugasan untuk mewakili tugasan, yang mengandungi medan Id. Fungsi processTask mensimulasikan proses memproses tugasan Di sini ia hanya mencetak ID tugas.

Dalam fungsi utama, kami mula-mula menetapkan saiz kolam coroutine kepada 5 dan mencipta saluran jenis Tugas. Seterusnya, kami menetapkan bilangan coroutine menunggu dengan memanggil kaedah wg.Add dan mencipta 5 coroutine pekerja untuk mengendalikan tugas.

Kemudian kami menambah 20 tugasan pada baris gilir tugasan melalui gelung dan menutup saluran tugasan untuk memberitahu kumpulan coroutine bahawa tugasan telah selesai.

Akhir sekali, kami memanggil kaedah wg.Wait untuk menunggu semua coroutine menyelesaikan tugas mereka.

Menggunakan contoh kod di atas, kami boleh mengendalikan tugas berskala besar dengan mudah. Dengan menggunakan WaitGroup dan kumpulan coroutine, kami boleh mengendalikan tugas serentak dengan cekap, menggunakan sepenuhnya sumber sistem dan mengelakkan pembaziran sumber dan masalah prestasi yang disebabkan oleh pemprosesan benang.

Ringkasan:
Dalam artikel ini, kami memperkenalkan cara menggunakan WaitGroup dan kumpulan coroutine Golang untuk mengendalikan tugas berskala besar. Dengan menggunakan WaitGroup untuk menunggu penghujung kumpulan coroutine dan menggunakan kumpulan coroutine untuk mengawal jumlah concurrency, kami boleh mengendalikan sejumlah besar tugas dengan cekap. Dengan menulis kod selamat serentak dan mengurus saiz kumpulan coroutine dan peruntukan tugas secara munasabah, kami boleh menggunakan sepenuhnya sumber sistem dan meningkatkan kecekapan pemprosesan tugas. Saya harap artikel ini akan membantu anda memahami dan menggunakan WaitGroup dan kumpulan coroutine.

Atas ialah kandungan terperinci Pemprosesan tugas berskala besar: menggunakan Golang WaitGroup dan kumpulan coroutine. 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