Terdapat hubungan ibu bapa-anak antara fungsi dan goroutine dalam Go Goroutine induk mencipta goroutine kanak-kanak, dan goroutine kanak-kanak boleh mengakses pembolehubah goroutine induk tetapi bukan sebaliknya. Buat goroutine kanak-kanak menggunakan kata kunci go Goroutine kanak-kanak dilaksanakan melalui fungsi tanpa nama atau fungsi bernama. Gorutin ibu bapa boleh menunggu gorouti anak dilengkapkan melalui penyegerakan.WaitGroup untuk memastikan program tidak keluar sebelum semua gorouti kanak-kanak selesai.
Dalam bahasa Go, goroutine ialah fungsi yang dilaksanakan serentak. Goroutines dianjurkan dalam hubungan ibu bapa-anak, dengan goroutine ibu bapa mencipta goroutine kanak-kanak. Goroutine kanak-kanak mempunyai akses kepada pembolehubah goroutine induk, tetapi goroutine induk tidak boleh mengakses pembolehubah goroutine kanak-kanak.
Buat goroutine kanak-kanak menggunakan kata kunci go
: go
关键字创建一个子 goroutine:
go func() { // 子 goroutine 代码 }
子 goroutine 执行匿名函数。同样,我们可以将命名的函数传递给 go
关键字:
func child() { // 子 goroutine 代码 } go child()
子 goroutine 可以访问父 goroutine 的局部变量,而无需显式传递。这是因为 goroutine 在同一内存空间中执行。例如:
func parent() { count := 10 go func() { fmt.Println(count) // 输出 10 }() }
子 goroutine 可以安全地访问和修改父 goroutine 的变量。但是,由于并发,必须使用锁或其他同步机制来防止数据竞争。
父 goroutine 可以使用 sync.WaitGroup
等待子 goroutine 完成。WaitGroup
跟踪剩余子 goroutine 的数量,并提供 Add
和 Wait
方法:
func parent() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // 子 goroutine 代码 }() wg.Wait() // 等待子 goroutine 完成 }
考虑一个并行文件下载器,从多个远程 URL 下载文件。我们可以使用 goroutines 来并发下载,如下所示:
func main() { var wg sync.WaitGroup urls := []string{"url1", "url2", "url3"} for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() downloadFile(url) }(url) } wg.Wait() // 等待所有文件下载完成 }
在这个案例中,主 goroutine 创建子 goroutine 来下载每个文件。主 goroutine 使用 WaitGroup
rrreee
go
: sync.WaitGroup
untuk menunggu goroutine anak selesai. WaitGroup
menjejaki bilangan goroutin kanak-kanak yang tinggal dan menyediakan kaedah Tambah
dan Tunggu
: 🎜rrreee🎜Kes praktikal: pemuat turun fail🎜🎜Pertimbangkan Fail yang selari Pemuat turun, muat turun fail daripada berbilang URL jauh. Kita boleh menggunakan goroutine untuk muat turun serentak seperti yang ditunjukkan di bawah: 🎜rrreee🎜 Dalam kes ini, goroutine utama mencipta goroutine kanak-kanak untuk memuat turun setiap fail. Goroutine utama menggunakan WaitGroup
untuk menunggu semua gorout kanak-kanak selesai, memastikan program tidak keluar sebelum semua fail dimuat turun. 🎜🎜Kesimpulan🎜🎜Memahami hubungan ibu bapa-anak antara fungsi dan goroutin adalah penting untuk membina program Go selari yang mantap. Dengan memahami akses berubah-ubah dan mekanisme penyegerakan goroutine, kami boleh mencipta aplikasi serentak berprestasi tinggi. 🎜Atas ialah kandungan terperinci Hubungan ibu bapa-anak antara fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!