Rumah > Artikel > pembangunan bahagian belakang > Peruntukan sumber fungsi golang dan goroutine
Fungsi memperuntukkan sumber semasa pelaksanaan dan melepaskannya secara automatik selepas pelaksanaan; manakala goroutine memperuntukkan sumber apabila ia dicipta dan perlu ditutup secara eksplisit atau menggunakan konteks atau WaitGroup untuk memastikan pelepasan untuk mengelakkan kebocoran memori dan kemerosotan prestasi.
Dalam bahasa Go, fungsi dan goroutin adalah mekanisme serentak yang biasa digunakan. Fungsi ialah unit pelaksanaan kod, dan goroutine ialah fungsi yang dilaksanakan secara serentak. Peruntukan sumber yang betul kepada fungsi dan goroutin adalah penting untuk mengoptimumkan prestasi program dan mencegah pembaziran sumber.
Fungsi hanya menduduki sumber semasa pelaksanaan dan secara automatik mengeluarkan semua sumber selepas pelaksanaan. Anda boleh memastikan bahawa sumber dikeluarkan sebelum fungsi kembali dengan menggunakan pernyataan tunda
. Contohnya: defer
语句来确保资源在函数返回前释放。例如:
func cleanup() { // 释放资源 } func main() { defer cleanup() // 执行代码 }
与函数不同,goroutine 在创建时分配资源,并且直到 goroutine 退出才释放这些资源。如果不及时释放 goroutine,会导致内存泄漏和性能下降。
有几种方法可以确保 goroutine 释放资源:
显式关闭 channel 和 other 资源:
c := make(chan int) // 使用 channel close(c)
使用 context.Done()
:
ctx, cancel := context.WithCancel(context.Background()) // 使用 context cancel()
通过 WaitGroup
等待 goroutine 退出:
var wg sync.WaitGroup wg.Add(1) go func() { // 执行代码 wg.Done() }() wg.Wait()
在以下示例中,我们创建了多个 goroutine 来执行异步任务:
package main import ( "context" "fmt" "sync" ) func main() { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() fmt.Println("Goroutine", i) // 使用 ctx 来响应取消请求 select { case <-ctx.Done(): fmt.Println("Goroutine", i, "cancelled") return default: // 继续执行任务 } }(i) } // 取消所有 goroutine cancel() wg.Wait() }
运行此程序,输出如下:
Goroutine 0 Goroutine 1 Goroutine 2 Goroutine 3 Goroutine 4 Goroutine 5 Goroutine 0 cancelled Goroutine 1 cancelled Goroutine 2 cancelled Goroutine 3 cancelled Goroutine 4 cancelled Goroutine 5 cancelled Goroutine 6 Goroutine 7 Goroutine 8 Goroutine 9 Goroutine 6 cancelled Goroutine 7 cancelled Goroutine 8 cancelled Goroutine 9 cancelled
从输出中可以看出,当 cancel()
rrreee
WaitGroup
:🎜 rrreee li>cancel()
dipanggil, semua goroutine mengeluarkan sumber dalam masa. 🎜Atas ialah kandungan terperinci Peruntukan sumber fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!