Dalam bahasa Go, coroutine ialah mekanisme pengaturcaraan serentak yang penting. Ia membolehkan pelbagai tugas dilaksanakan secara selari, dengan itu meningkatkan kecekapan program. Pelaksanaan coroutine bahasa Go adalah berdasarkan utas ringan (atau utas peringkat pengguna), jadi kos untuk mencipta dan memusnahkan coroutine adalah sangat kecil. Walau bagaimanapun, dalam pembangunan sebenar, kita kadangkala perlu menutup coroutine yang sedang berjalan, dan dalam kes ini kita perlu menggunakan beberapa cara khas untuk mencapai ini. Artikel ini memperkenalkan beberapa kaedah dan teknik tentang penutupan coroutine golang.
1. Sifat coroutine
Sebelum memahami cara menutup coroutine, kita perlu terlebih dahulu memahami sifat coroutine. Coroutine pada asasnya ialah urutan pelaksanaan bebas yang dilaksanakan selari dengan utas utama. Setiap coroutine mempunyai timbunan sendiri dan pembolehubah tempatan, tetapi mereka berkongsi proses yang sama dan pembolehubah global. Penciptaan dan pemusnahan coroutine hanya memerlukan beberapa arahan, jadi ia sangat cekap.
2. Cara menutup coroutine
Dalam bahasa Go, anda boleh menggunakan konteks.Konteks untuk Kawalan pelaksanaan coroutine. Konteks dengan fungsi pembatalan boleh dibuat melalui fungsi konteks.DenganBatal Apabila fungsi Batal Konteks dipanggil, semua coroutine yang bergantung pada Konteks akan ditutup. Berikut ialah kod contoh mudah:
func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { for { select { case <-ctx.Done(): log.Println("The goroutine is stopped.") return default: // do something } } }() time.Sleep(time.Second) cancel() time.Sleep(time.Second) }
Dalam contoh ini, kami mencipta Konteks dengan fungsi pembatalan dan mencipta coroutine di mana operasi tertentu dijalankan secara berterusan sehingga Konteks dibatalkan. Tunggu satu saat dalam utas utama dan kemudian panggil fungsi Batal Konteks untuk menutup coroutine.
Selain menggunakan konteks.Konteks untuk mengawal perjalanan coroutine, anda juga boleh menggunakan saluran untuk mencapai ini. Biasanya, kita boleh mencipta saluran jenis bool untuk menghantar isyarat sama ada untuk menutup coroutine. Apabila utas utama memanggil fungsi tutup saluran, semua coroutine yang membaca saluran akan menerima isyarat nilai sifar dan keluar. Berikut ialah kod sampel:
func main() { stopCh := make(chan bool) go func() { for { select { case <-stopCh: log.Println("The goroutine is stopped.") return default: // do something } } }() time.Sleep(time.Second) close(stopCh) time.Sleep(time.Second) }
Dalam contoh ini, kami mencipta saluran jenis bool untuk menghantar isyarat sama ada untuk menutup coroutine. Dalam coroutine, gunakan pernyataan pilih untuk terus menyemak sama ada saluran ditutup, dan jika ditutup, keluar. Tunggu satu saat dalam utas utama dan kemudian panggil fungsi tutup saluran untuk menutup coroutine.
Selain menggunakan konteks.Konteks dan saluran untuk mengawal perjalanan coroutine, anda juga boleh menggunakan penyegerakan.WaitGroup. WaitGroup ialah kaunter yang boleh digunakan untuk menunggu penghujung kumpulan coroutine. Khususnya, apabila coroutine dibuat, kaunter WaitGroup ditambah satu, dan selepas coroutine dilaksanakan, kaunter dikurangkan satu. Dalam urutan utama, panggil fungsi Tunggu WaitGroup untuk menunggu semua coroutine selesai melaksanakan dan kemudian menutup program. Berikut ialah contoh kod:
func main() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() for { // do something } }() time.Sleep(time.Second) wg.Done() wg.Wait() }
Dalam contoh ini, kami mencipta WaitGroup dan menambah satu bilangan. Dalam coroutine, lakukan operasi tertentu, tunggu penghujung coroutine, dan panggil fungsi Selesai WaitGroup untuk mengurangkan pembilang dengan satu. Tunggu satu saat dalam urutan utama sebelum memanggil fungsi WaitGroup's Done, dan kemudian panggil fungsi Wait untuk menunggu semua coroutine selesai melaksanakan dan kemudian menutup program.
3. Ringkasan
Coroutine bahasa Go ialah mekanisme pengaturcaraan serentak yang sangat berkuasa dan digunakan secara meluas dalam pembangunan. Walau bagaimanapun, dalam pembangunan sebenar, kadangkala kita perlu menutup coroutine yang sedang berjalan, dan dalam kes ini kita perlu menggunakan beberapa cara khas untuk mencapai ini. Artikel ini memperkenalkan beberapa kaedah dan teknik untuk menutup coroutine golang saya harap ia akan membantu semua orang.
Atas ialah kandungan terperinci Golang coroutine ditutup. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!