Maison  >  Article  >  développement back-end  >  Allocation des ressources des fonctions Golang et goroutine

Allocation des ressources des fonctions Golang et goroutine

王林
王林original
2024-04-25 12:42:021045parcourir

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.

Allocation des ressources des fonctions Golang et goroutine

Allocation pratique des ressources des fonctions Golang et des Goroutines

Introduction

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.

Allocation des ressources des fonctions

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,会导致内存泄漏和性能下降。

有几种方法可以确保 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

Allocation des ressources de Goroutine🎜🎜Contrairement aux fonctions, les goroutines allouent des ressources lors de leur création, et ces ressources ne sont libérées qu'à la sortie de la goroutine. Si goroutine n'est pas publié à temps, des fuites de mémoire et une dégradation des performances se produiront. 🎜🎜Il existe plusieurs façons de garantir que goroutine libère les ressources : 🎜
  • 🎜Fermer explicitement les chaînes et autres ressources : 🎜rrreee
  • 🎜Utiliser context.Done() :🎜rrreee
  • 🎜En attente de la sortie de la goroutine via WaitGroup :🎜 rrreee li>
🎜Cas pratique🎜🎜Dans l'exemple suivant, nous créons plusieurs goroutines pour effectuer des tâches asynchrones :🎜rrreee🎜En exécutant ce programme, le résultat est le suivant :🎜rrreee🎜Comme le montre le sortie, lorsque 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn