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

Pengaturcaraan serentak Golang: menggunakan Go WaitGroup untuk melaksanakan penjadual tugas

王林
王林asal
2023-09-27 14:51:391258semak imbas

Golang并发编程:使用Go WaitGroup实现任务调度器

Golang pengaturcaraan serentak: Gunakan Go WaitGroup untuk melaksanakan penjadual tugas

  1. Pengenalan
    Di Golang, melaksanakan pengaturcaraan serentak boleh meningkatkan prestasi dan kecekapan program. Penjadual tugas adalah bahagian yang sangat penting dalam pengaturcaraan serentak. Ia boleh digunakan untuk menjadualkan urutan pelaksanaan tugas serentak dan penyiapan tugasan yang disegerakkan. Artikel ini akan memperkenalkan cara menggunakan WaitGroup di Golang untuk melaksanakan penjadual tugas mudah dan memberikan contoh kod khusus.
  2. Pengenalan kepada WaitGroup
    WaitGroup ialah jenis penting dalam penyegerakan pakej Golang, yang menyediakan fungsi penyegerakan dan menunggu untuk tugasan serentak. WaitGroup mempunyai tiga kaedah utama: Tambah, Selesai dan Tunggu.
  • Tambah(n int): Tambahkan n tugasan serentak pada WaitGroup.
  • Selesai(): Tandakan tugasan sebagai selesai.
  • Tunggu(): Tunggu semua tugasan selesai dan sekat goroutine semasa.

WaitGroup mengekalkan kaunter secara dalaman untuk merekodkan bilangan tugasan yang belum selesai. Apabila kaedah Tambah dipanggil, pembilang ditambah dengan nilai yang ditentukan; apabila kaedah Selesai dipanggil, pembilang dikurangkan dengan 1 apabila kaedah Tunggu dipanggil, jika pembilang lebih besar daripada 0, goroutine semasa akan menjadi disekat sehingga kaunter kembali kepada sifar.

  1. Pelaksanaan Penjadual Tugas
    Berikut ialah contoh kod untuk melaksanakan penjadual tugas menggunakan WaitGroup:
package main

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

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting
", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done
", id)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("All workers done")
}

Dalam contoh ini, kami menggunakan gelung for untuk memulakan 5 goroutin pekerja dan hubungi wg.Add(1) untuk menambah nombor tugas kepada WaitGroup. Dalam fungsi pekerja, gunakan kata kunci tangguh untuk memastikan wg.Done() dipanggil sebelum fungsi kembali untuk mengurangkan nilai pembilang. Akhir sekali, gunakan wg.Wait() untuk menunggu semua tugasan selesai.

  1. run Hasil
    Run Kod sampel ini, anda akan melihat output berikut:
Worker 1 starting
Worker 2 starting
Worker 3 starting
Worker 4 starting
Worker 5 starting
Worker 3 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 4 done
All workers done

Anda dapat melihat bahawa semua goroutine pekerja dilaksanakan secara serentak, tetapi urutan output tidak semestinya dalam urutan permulaan. penjadualan dilakukan oleh masa jalan Go.

  1. Ringkasan
    Menggunakan WaitGroup boleh melaksanakan penjadualan dan penyegerakan tugas serentak dengan mudah. Penyegerakan dan kawalan jujukan tugas boleh dicapai dengan memanggil kaedah Tambah untuk menambah bilangan tugas, memanggil kaedah Selesai untuk menandakan selesai tugas dan memanggil kaedah Tunggu untuk menunggu tugasan selesai. Dalam aplikasi praktikal, penjadual tugas boleh digunakan untuk mengendalikan tugas serentak, mengehadkan bilangan konkurensi dan senario lain, membantu kami menggunakan lebih baik keupayaan serentak Golang.

Melalui pengenalan dan contoh kod artikel ini, saya percaya anda mempunyai pemahaman yang lebih mendalam tentang cara menggunakan WaitGroup Golang untuk melaksanakan penjadual tugas. Saya harap artikel ini akan membantu anda mempelajari dan menggunakan pengaturcaraan serentak di Golang!

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