Maison >développement back-end >Golang >Allocation des ressources des fonctions Golang et goroutine
La fonction alloue des ressources pendant l'exécution et les libère automatiquement après l'exécution ; tandis que goroutine alloue des ressources lors de sa création et doit être explicitement fermée ou utiliser un contexte ou WaitGroup pour garantir la libération afin d'éviter les fuites de mémoire et la dégradation des performances.
Dans le langage Go, les fonctions et les goroutines sont des mécanismes de concurrence couramment utilisés. Une fonction est une unité d'exécution de code et une goroutine est une fonction exécutée simultanément. Une allocation appropriée des ressources aux fonctions et aux goroutines est cruciale pour optimiser les performances du programme et éviter le gaspillage des ressources.
La fonction n'occupe les ressources que pendant l'exécution et libère automatiquement toutes les ressources après l'exécution. Vous pouvez vous assurer que les ressources sont libérées avant le retour de la fonction en utilisant l'instruction defer
. Par exemple : 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()
est appelée, toutes les goroutines libèrent des ressources à temps. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!