Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan serentak Golang: menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas

Pengaturcaraan serentak Golang: menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas

王林
王林asal
2023-09-28 22:24:241427semak imbas

Golang并发编程:利用Go WaitGroup实现任务队列

Golang pengaturcaraan serentak: menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas

Dengan peningkatan berterusan prestasi komputer, penggunaan pemproses berbilang teras untuk pengaturcaraan serentak telah Menjadi kemahiran penting. Sebagai bahasa pengaturcaraan yang menekankan konkurensi, Golang menyediakan model konkurensi yang ringkas dan berkuasa, membolehkan pembangun menggunakan pemproses berbilang teras dengan lebih mudah.

Di Golang, WaitGroup ialah mekanisme yang digunakan untuk menyelaraskan penyegerakan antara goroutine. Ia menetapkan pembilang kepada nilai bukan sifar sebelum memulakan goroutine, dan kemudian mengurangkan pembilang selepas setiap goroutine menyelesaikan kerjanya. Apabila nilai pembilang ialah 0, ini bermakna semua goroutine telah menyelesaikan tugas mereka dan boleh terus melakukan operasi seterusnya.

Dalam artikel ini, kami akan menggunakan WaitGroup untuk melaksanakan baris gilir tugasan mudah untuk menunjukkan cara menggunakan mekanisme ini untuk melaksanakan pengaturcaraan serentak. Secara khusus, kami akan melaksanakan program pengendalian fail mudah yang boleh mengendalikan berbilang fail pada masa yang sama.

Pertama, kita perlu mentakrifkan struktur untuk mewakili tugas fail:

type FileTask struct {
    filename string
}

func (task *FileTask) Process() {
    // 文件处理逻辑
}

Dalam kod di atas, struktur FileTask mewakili tugas fail, yang mengandungi medan nama fail . Kaedah Proses digunakan untuk logik sebenar memproses fail.

Seterusnya, kami mentakrifkan baris gilir tugas:

type TaskQueue struct {
    tasks []FileTask
    wg    sync.WaitGroup
}

func (queue *TaskQueue) Add(task FileTask) {
    queue.tasks = append(queue.tasks, task)
}

func (queue *TaskQueue) StartWorkers(numWorkers int) {
    for i := 0; i < numWorkers; i++ {
        go queue.worker()
    }
}

func (queue *TaskQueue) worker() {
    defer queue.wg.Done()

    for {
        task, ok := queue.getNextTask()

        if !ok {
            return
        }

        task.Process()
    }
}

func (queue *TaskQueue) getNextTask() (FileTask, bool) {
    if len(queue.tasks) == 0 {
        return FileTask{}, false
    }

    task := queue.tasks[0]
    queue.tasks = queue.tasks[1:]

    return task, true
}

func (queue *TaskQueue) Wait() {
    queue.wg.Wait()
}

Kod di atas mentakrifkan struktur TaskQueue, yang mengandungi baris gilir tugas dan WaitGroup. Kaedah Tambah digunakan untuk menambah tugas pada baris gilir, dan kaedah StartWorkers memulakan bilangan goroutin pekerja yang ditentukan Setiap pekerja akan terus mendapatkan tugas daripada baris gilir dan melaksanakannya sehingga baris gilir kosong. Kaedah getNextTask digunakan untuk mendapatkan tugas seterusnya daripada baris gilir, dan mengembalikan palsu jika baris gilir kosong. Akhir sekali, kaedah Tunggu digunakan untuk menunggu semua gorout pekerja menyelesaikan tugas mereka.

Akhir sekali, kita boleh menggunakan baris gilir tugas di atas untuk memproses fail:

func main() {
    queue := TaskQueue{}

    for _, filename := range filenames {
        task := FileTask{filename: filename}
        queue.Add(task)
    }

    queue.StartWorkers(numWorkers)
    queue.Wait()
}

Dalam kod di atas, kami mula-mula membuat baris gilir kosong, kemudian ulangi semua nama fail, dan Bina setiap nama fail ke dalam objek tugas dan tambahkannya pada baris gilir. Seterusnya, kami memulakan bilangan goroutin pekerja yang ditentukan, yang akan mendapatkan tugas daripada baris gilir dan memprosesnya. Akhir sekali, kami memanggil kaedah Tunggu untuk menunggu semua pemprosesan tugas selesai.

Melalui contoh kod di atas, kita dapat melihat bahawa menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas adalah sangat mudah dan intuitif. Kami hanya perlu menentukan struktur tugas dan baris gilir, dan menulis kaedah yang sepadan untuk merealisasikan pengagihan dan pelaksanaan tugas, dan menunggu selepas semua tugas selesai.

Ringkasan:
Menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas ialah teknologi pengaturcaraan serentak yang mudah dan berkuasa. Dengan menggunakan WaitGroup dan goroutine secara rasional, kami boleh menggunakan sepenuhnya prestasi pemproses berbilang teras dan melaksanakan program serentak yang cekap. Oleh itu, apabila melakukan pengaturcaraan serentak Golang, penggunaan WaitGroup yang munasabah sangat membantu untuk melaksanakan baris gilir tugas.

Atas ialah kandungan terperinci Pengaturcaraan serentak Golang: menggunakan Go WaitGroup untuk melaksanakan baris gilir tugas. 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