Maison  >  Article  >  développement back-end  >  Débogage et analyse des coroutines Golang

Débogage et analyse des coroutines Golang

WBOY
WBOYoriginal
2024-04-15 17:12:011022parcourir

Débogage et analyse Go Coroutine Le débogage et analyse Go Coroutine peuvent aider à résoudre des problèmes tels que les courses de données et les blocages. Outil de débogage pprof : outil d'analyse des performances pour analyser la planification des coroutines, l'utilisation de la mémoire et l'utilisation du processeur. GODEBUG=schedtrace=10 : variable d'environnement pour activer le suivi de la planification des coroutines. go tool trace : génère des traces d'exécution d'application, y compris l'état de la coroutine. Cas pratique data racing : pprof peut identifier et analyser les data racing. Deadlock : la trace de l'outil go peut visualiser les interactions de coroutine et identifier les blocages.

Débogage et analyse des coroutines Golang

Débogage et profilage des coroutines Go

Le débogage et le profilage des coroutines sont cruciaux pour écrire des applications Go efficaces et sans erreur. Les coroutines Go offrent des capacités de concurrence et de parallèle, mais si elles sont mal utilisées, elles peuvent provoquer des courses de données et des problèmes de performances.

Outils de débogage

Go fournit de puissants outils de débogage pour aider à localiser et à résoudre les problèmes liés à la coroutine.

  • pprof : Un outil d'analyse des performances qui peut être utilisé pour analyser la planification des coroutines, l'utilisation de la mémoire et l'utilisation du processeur.
  • GODEBUG=schedtrace=10 : Une variable d'environnement qui permet de tracer la planification des coroutines.
  • go tool trace : Un outil qui génère des traces d'exécution d'applications, y compris l'état de la coroutine.

Cas pratique

Course aux données

La course aux données entre coroutines peut être difficile à détecter. pprof peut être utilisé pour identifier et analyser les courses de données.

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var mu sync.Mutex
var counter int

func main() {
    for i := 0; i < 10; i++ {
        go func() {
            mu.Lock()
            counter++
            mu.Unlock()
        }()
    }

    runtime.Goexit() // 模拟程序退出
}

Lors de l'exécution de ce programme, la sortie pprof affichera ce qui suit :

Command Line:
pprof

CPU Profile:
Total: 7.22s
        58.91%  3.51s  Frees (117 ops)
40.14% of CPU time spent in goroutine 87 (running)

La sortie indique que la 87ème coroutine monopolise le temps CPU, probablement parce que le verrou n'est pas déverrouillé correctement.

Deadlock

Deadlock est un autre problème que les coroutines peuvent rencontrer. La trace de l'outil go peut être utilisée pour visualiser les interactions de coroutine et identifier les blocages.

package main

import (
    "fmt"
    "sync"
)

var mu1, mu2 sync.Mutex

func main() {
    go func() {
        mu1.Lock()
        mu2.Lock()
        mu1.Unlock()
        mu2.Unlock()
    }()

    go func() {
        mu2.Lock()
        mu1.Lock()
        mu2.Unlock()
        mu1.Unlock()
    }()

    fmt.Println("Deadlock detected...")
}

Lors de l'exécution de ce programme, la sortie de trace de l'outil go générera un graphique montrant deux coroutines s'attendant l'une l'autre, provoquant une impasse.

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