Untuk menggunakan sync.WaitGroup
untuk menunggu pelbagai goroutine selesai, anda mengikuti langkah -langkah ini:
Inisialisasi Waitgroup : Pertama, anda perlu membuat contoh sync.WaitGroup
. Ini biasanya dilakukan menggunakan perisytiharan mudah:
<code class="go">var wg sync.WaitGroup</code>
Tambah ke Waitgroup : Sebelum memulakan goroutine anda, anda akan meningkatkan kaunter Waitgroup untuk setiap goroutine yang anda ingin mulakan. Ini memberitahu kumpulan Waitgroup berapa banyak goroutin yang perlu menunggu:
<code class="go">wg.Add(1)</code>
Mula Goroutines : Dalam fungsi Goroutine, anda menggunakan pernyataan penangguhan untuk menurunkan kaunter apabila goroutine selesai. Ini memastikan bahawa kaunter diturunkan walaupun Goroutine keluar sebelum panik:
<code class="go">go func() { defer wg.Done() // Goroutine work here }()</code>
Tunggu siap : Setelah memulakan semua goroutine anda, anda panggil Wait()
di Waitgroup. Ini menghalang pelaksanaan goroutine utama sehingga kaunter mencapai sifar, yang bermaksud semua goroutin yang dikesan telah selesai:
<code class="go">wg.Wait()</code>
Inilah contoh lengkap:
<code class="go">package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 1; i </code>
Apabila menggunakan sync.WaitGroup
, terdapat beberapa perangkap biasa untuk mengelakkan:
Add
Sebelum memulakan Goroutine : Jika anda memulakan goroutine sebelum menelefon Add
, kaunter Waitgroup tidak akan mencerminkan bilangan goroutin yang betul untuk menunggu, yang membawa kepada penamatan pramatang Wait()
panggilan.Add
dan Done
: Pastikan setiap Add(1)
panggilan mempunyai panggilan yang sama Done()
. Sekiranya ini tidak sesuai, sama ada program ini akan digantung selama -lamanya atau Wait()
akan kembali terlebih dahulu.Add
dan Done
: Berhati -hatilah untuk tidak Add
atau Done
serentak dengan Wait
. Kesilapan yang biasa adalah untuk memanggil Add
selepas memulakan goroutine yang menggunakan Done
, yang boleh membawa kepada keadaan perlumbaan.defer
yang Done
: Ini adalah amalan yang baik untuk menggunakan defer wg.Done()
pada permulaan goroutine anda. Ini memastikan yang Done
dipanggil walaupun panik goroutine. sync.WaitGroup
memainkan peranan penting dalam menguruskan kitaran hayat operasi serentak dengan menyediakan mekanisme mudah untuk menyegerakkan penyempurnaan pelbagai goroutine. Inilah cara ia membantu:
sync.WaitGroup
memastikan bahawa goroutine utama menunggu semua goroutine yang ditanam untuk menyelesaikan tugas mereka sebelum meneruskan. Ini adalah penting untuk mengekalkan susunan operasi yang betul dalam program serentak.sync.WaitGroup
membantu menguruskan kitaran hayat goroutin ini. Ia membolehkan program mengetahui apabila semua operasi selesai, yang penting untuk pembersihan, pelepasan sumber, atau pemprosesan selanjutnya.sync.WaitGroup
sendiri tidak mengendalikan kesilapan, ia memudahkan pendekatan berstruktur untuk kesesuaian di mana kesilapan dari goroutin individu boleh dikumpulkan dan diproses selepas semua goroutine selesai.sync.WaitGroup
skala dengan baik dengan bilangan goroutine. Sama ada anda mempunyai dua atau dua ribu goroutine, mekanisme tetap sama, menjadikannya sesuai untuk aplikasi dari skrip kecil ke sistem berskala besar. Berikutan amalan terbaik apabila memulakan dan menggunakan sync.WaitGroup
dalam program GO boleh memastikan pengurusan kesesuaian yang cekap dan betul. Berikut adalah amalan utama:
Inisialisasi Waitgroup secara tempatan : Inisialisasi sync.WaitGroup
dalam fungsi atau skop di mana ia diperlukan. Ini mengurangkan kemungkinan penggunaan semula dan keadaan perlumbaan yang tidak disengajakan:
<code class="go">func someFunction() { var wg sync.WaitGroup // Use wg within this function }</code>
Gunakan Add
Sebelum Memulakan Goroutine : Sentiasa hubungi Add
sebelum memulakan goroutine. Ini mengelakkan keadaan kaum di mana goroutine mungkin selesai sebelum Add
dipanggil:
<code class="go">wg.Add(1) go func() { defer wg.Done() // Goroutine work }()</code>
Defer Done
Panggilan : Gunakan defer wg.Done()
pada permulaan goroutine anda untuk memastikan ia dipanggil walaupun panik goroutine:
<code class="go">go func() { defer wg.Done() // Goroutine work }()</code>
sync.WaitGroup
telah menyelesaikan kitaran hayatnya (iaitu, selepas Wait
pulangan), jangan gunakannya semula. Buat sync.WaitGroup
baru untuk set goroutine baru. Kesalahan mengendalikan : Kumpulkan dan mengendalikan kesilapan dari goroutin selepas Wait
pulangan. Anda boleh menggunakan saluran atau mekanisme penyegerakan lain untuk menyampaikan kesilapan kembali ke goroutine utama:
<code class="go">errors := make(chan error, len(workers)) for _, worker := range workers { wg.Add(1) go func(w Worker) { defer wg.Done() if err := w.DoWork(); err != nil { errors </code>
Dengan mengikuti amalan terbaik ini, anda boleh menggunakan sync.WaitGroup
secara berkesan untuk menguruskan operasi serentak di GO, memastikan program anda teguh dan boleh dipercayai.
Atas ialah kandungan terperinci Bagaimana anda menggunakan sync.waitGroup untuk menunggu pelbagai goroutine selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!