Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Hubungan ibu bapa-anak antara fungsi golang dan goroutine

Hubungan ibu bapa-anak antara fungsi golang dan goroutine

WBOY
WBOYasal
2024-04-25 12:57:02349semak imbas

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.

Hubungan ibu bapa-anak antara fungsi golang dan goroutine

Hubungan ibu bapa-anak antara fungsi bahasa Go dan goroutine

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

Buat goroutine kanak-kanak menggunakan kata kunci go: go 关键字创建一个子 goroutine:

go func() {
  // 子 goroutine 代码
}

子 goroutine 执行匿名函数。同样,我们可以将命名的函数传递给 go 关键字:

func child() {
  // 子 goroutine 代码
}

go child()

访问父 goroutine 变量

子 goroutine 可以访问父 goroutine 的局部变量,而无需显式传递。这是因为 goroutine 在同一内存空间中执行。例如:

func parent() {
  count := 10
  go func() {
    fmt.Println(count) // 输出 10
  }()
}

子 goroutine 可以安全地访问和修改父 goroutine 的变量。但是,由于并发,必须使用锁或其他同步机制来防止数据竞争。

父 goroutine 等待子 goroutine

父 goroutine 可以使用 sync.WaitGroup 等待子 goroutine 完成。WaitGroup 跟踪剩余子 goroutine 的数量,并提供 AddWait 方法:

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 使用 WaitGrouprrreee

Seorang goroutine kanak-kanak melaksanakan fungsi tanpa nama. Begitu juga, kita boleh menghantar fungsi yang dinamakan kepada kata kunci go:

rrreee

Akses pemboleh ubah goroutine induk

Groutine anak boleh mengakses pembolehubah tempatan goroutine induk tanpa lulus secara eksplisit. Ini kerana goroutine dilaksanakan dalam ruang memori yang sama. Contohnya: 🎜rrreee🎜Seorang goroutine kanak-kanak boleh mengakses dan mengubah suai pembolehubah goroutine induk dengan selamat. Walau bagaimanapun, disebabkan konkurensi, kunci atau mekanisme penyegerakan lain mesti digunakan untuk mengelakkan perlumbaan data. 🎜🎜Groutine induk menunggu goroutine anak🎜🎜Groutine induk boleh menggunakan 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!

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