Sync.WaitGroup digunakan untuk menunggu sekumpulan goroutin untuk menyelesaikan tugas. Intinya adalah untuk bekerjasama melalui tiga kaedah: tambah, selesai, dan tunggu. 1. Tambah (n) menetapkan bilangan goroutin untuk menunggu; 2. Selesai () dipanggil pada akhir setiap goroutine, dan kiraan dikurangkan oleh satu; 3. Tunggu () menghalang coroutine utama sehingga semua tugas selesai. Apabila menggunakannya, sila ambil perhatian: Tambah hendaklah dipanggil di luar goroutine, elakkan tunggu pendua, dan pastikan untuk memastikan bahawa Don dipanggil. Adalah disyorkan untuk menggunakannya dengan menangguhkan. Ia adalah perkara biasa dalam merangkak bersama laman web, pemprosesan data batch dan senario lain, dan dapat mengawal proses konkurensi dengan berkesan.
Ia sebenarnya agak biasa untuk menggunakan sync.WaitGroup
Go untuk menguruskan tugas serentak, terutamanya apabila menyegerakkan pelbagai goroutine. Ringkasnya, ia adalah kaunter yang digunakan untuk menunggu satu set coroutine untuk disiapkan.

Berikut adalah contoh mudah untuk menerangkan cara menggunakannya, yang sesuai untuk rakan -rakan yang baru untuk pengaturcaraan serentak.
Struktur asas dan penggunaan
Terdapat tiga kaedah utama Waitgroup: Add(n)
, Done()
dan Wait()
.

-
Add(n)
: Tetapkan bilangan goroutin untuk menunggu. -
Done()
: Dipanggil sekali selepas setiap goroutine dilaksanakan, yang bersamaan dengan menurunkan kaunter oleh satu. -
Wait()
: Blok coroutine semasa sehingga semua tugas panggilanDone()
.
Mari memberi contoh asas:
Pakej utama import ( "FMT" "Sync" "Masa" ) func main () { var wg sync.waitgroup untuk i: = 0; i <3; Saya { wg.add (1) pergi func (id int) { menangguhkan wg.done () fmt.printf ("goroutine %d start \ n", id) time.sleep (time.second) fmt.printf ("goroutine %d selesai \ n", id) } (id) } wg.wait () fmt.println ("Semua Goroutines selesai.") }
Dalam contoh ini, tiga goroutine dimulakan, dan fungsi utama akan menunggu sehingga mereka dilaksanakan sebelum keluar.

Mata yang mudah diabaikan semasa menggunakan
Walaupun Waitgroup adalah mudah, beberapa butiran terdedah kepada kesilapan jika anda tidak memberi perhatian kepada:
Tambah dipanggil di luar Goroutine
Jika anda memanggilAdd
goroutine, ia boleh menyebabkanWait()
untuk dilaksanakan sebelum ditambah, dengan itu berakhir lebih awal.Elakkan tunggu pendua
Kumpulan Waitgroup tidak disyorkan untuk digunakan semula melainkan anda secara jelas menetapkan semula status. Jika tidak, panggilan keduaWait()
mungkin tidak menyekat.Selesai mesti dipanggil
Jika anda lupa untuk memanggilDone()
, program akan terjebak denganWait()
. Ia adalah kebiasaan yang baik untuk digunakandefer
, pastikan untuk melaksanakannya.
Penggunaan biasa dalam senario sebenar
Kadang -kadang kita menggunakan Waitgroup dengan struktur lain, seperti pemprosesan batch data atau selari yang meminta antara muka luaran.
Katakan kami ingin merangkak kandungan laman web berganda serentak, kami boleh menulis seperti ini:
urls: = [] String {"https://example.com/1", "https://example.com/2", ...} var wg sync.waitgroup untuk _, url: = url pelbagai { wg.add (1) pergi func (u string) { menangguhkan wg.done () // simulasi permintaan resp, err: = http.get (u) jika err! = nil { fmt.println ("Ralat mengambil:", u) Kembali } fmt.println ("diambil:", resp.status) } (u) } wg.wait ()
Mod ini sangat biasa dalam crawler dan pemprosesan tugas latar belakang.
Pada dasarnya itu sahaja. Dengan menguasai penggunaan asas dan langkah berjaga -jaga sync.WaitGroup
, anda boleh mengawal proses kesesuaian dengan baik.
Atas ialah kandungan terperinci Contoh Sync.WaitGroup. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Enjin templat GO menyediakan keupayaan penjanaan kandungan dinamik yang kuat melalui pakej teks/templat dan HTML/templat, di mana HTML/Templat mempunyai fungsi melarikan diri automatik untuk mencegah serangan XSS, jadi ia harus digunakan terlebih dahulu apabila menghasilkan HTML. 1. Gunakan {{}} sintaks untuk memasukkan pembolehubah, penghakiman bersyarat dan gelung, seperti {{.fieldName}} untuk mengakses medan struktur, {{if}} dan {{range}} untuk melaksanakan kawalan logik. 2. Templat ini menyokong struktur data GO seperti struct, slice dan peta, dan titik dalam julat mewakili elemen berulang semasa. 3. Templat yang dinamakan boleh ditakrifkan melalui menentukan dan digunakan semula dengan arahan templat. 4.Ht

Integrasi GO dan Kafka adalah penyelesaian yang berkesan untuk membina sistem data masa nyata berprestasi tinggi. Perpustakaan klien yang sesuai harus dipilih mengikut keperluan: 1. Keutamaan diberikan kepada Kafka-Go untuk mendapatkan API gaya mudah dan sokongan konteks yang baik, sesuai untuk pembangunan pesat; 2. Pilih Sarama apabila kawalan baik atau fungsi lanjutan diperlukan; 3. Apabila melaksanakan pengeluar, anda perlu mengkonfigurasi alamat broker, tema dan strategi mengimbangi beban yang betul, dan menguruskan masa tamat dan penutupan melalui konteks; 4. Pengguna harus menggunakan kumpulan pengguna untuk mencapai skalabilitas dan toleransi kesalahan, secara automatik mengemukakan offset dan menggunakan pemprosesan serentak dengan munasabah; 5. Gunakan JSON, AVRO atau Protobuf untuk Serialization, dan disyorkan untuk menggabungkan Schemaregistr

govetcatchescommonlogicalerrorsandsuspiciousconstructsingocodesuchas1) misuseofprintf-stylefunctionswithincorrectarguments, 2) unkeyedstructliteralsthatmayleadtoincorrectfieldments, 3) SendingtoclosedChannelswhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichhichcanas

Apabila melewati kepingan di GO, ia biasanya diluluskan secara langsung dengan nilai, kerana tajuk Slice mengandungi penunjuk ke array yang mendasari, dan menyalin tajuk Slice tidak akan menyalin data yang mendasari, jadi pengubahsuaian unsur -unsur dalam fungsi akan mempengaruhi kepingan asal; 1. Jika anda perlu menetapkan semula atau menyesuaikan panjang kepingan dalam fungsi dan membuat perubahan berkuatkuasa, anda harus lulus penunjuk kepingan; 2. Jika tidak, anda boleh lulus kepingan secara langsung tanpa menggunakan penunjuk; 3. Jika pengagihan semula boleh dicetuskan apabila menggunakan tambahan, anda mesti melalui penunjuk untuk membuat kepingan yang dikemas kini kelihatan ke luar. Oleh itu, melainkan jika seluruh kepingan diganti, kepingan itu harus diluluskan dalam bentuk nilai.

Gunakan isyarat.Notify () dalam pakej OS/isyarat untuk mendaftarkan isyarat yang ditentukan (seperti SIGINT, SIGTERM) ke dalam saluran penampan, supaya program itu dapat ditangkap dan bukannya ditamatkan secara lalai; 2.

Usereflect.valueofandreflect.typeoftogetruntimevaluesandtypes; 2.InspectyPedetailSwithReflect.TypeMethodsLikeName () dan); 3.ModifyValuesViaReflect.Value.elem () andCanset () afterpassingApointer; 4.CallMethodSdynamiciSingSingMethodByName () andCall (); 5.r.

Untuk membenamkan kandungan fail ke dalam rentetan program GO, anda harus menggunakan GO: embed (Go1.16) untuk membenamkan fail pada masa penyusunan; 1. Tambah // Go: embed arahan di atas pemboleh ubah sasaran; 2. Pastikan laluan fail betul dan failnya wujud; 3. Gunakan pembolehubah jenis rentetan untuk menerima kandungan teks; 4. Membina projek melalui Gobuild untuk memasukkan kandungan fail. Kaedah ini selamat dan cekap dan tidak memerlukan alat tambahan, dan akhirnya melaksanakan kandungan fail terus ke dalam fail binari sebagai rentetan.

Dalam bahasa Go, middleware HTTP dilaksanakan melalui fungsi, dan jawapan terasnya ialah: middleware adalah fungsi yang menerima dan mengembalikan http.handler, yang digunakan untuk melaksanakan logik umum sebelum dan selepas pemprosesan permintaan. 1. 2. Middleware log dalam contoh merekodkan kaedah permintaan, laluan, alamat klien dan pemprosesan masa yang memakan, yang mudah untuk pemantauan dan penyahpepijatan; 3. Pengesahan middleware memeriksa tajuk kebenaran, dan mengembalikan kesilapan 401 atau 403 apabila pengesahan gagal memastikan akses yang selamat; 4. Pelbagai middleware boleh bersarang untuk menyesuaikan diri
