Maison > développement back-end > Golang > Comment gérer le cycle de vie de Goroutine dans Go ?

Comment gérer le cycle de vie de Goroutine dans Go ?

PHPz
Libérer: 2024-06-04 09:34:57
original
378 Les gens l'ont consulté

La méthode de base de gestion du cycle de vie de Goroutine dans Go est la suivante : Utiliser le contexte.Contexte : Contrôlez le cycle de vie de Goroutine via des signaux d'annulation et des délais. Utilisez sync.WaitGroup : attendez que le Goroutine termine sa tâche afin que le Goroutine principal puisse continuer son exécution. Utilisez des canaux : coordonnez plusieurs Goroutines via la communication par signal et attendez le traitement ultérieur une fois que toutes les Goroutines sont terminées.

如何在 Go 中管理 Goroutine 的生命周期?

Gérer le cycle de vie de Goroutine dans Go

Goroutine est un thread léger dans Go qui prend en charge la concurrence. Leur gestion est cruciale pour éviter les fuites de ressources et les plantages de programmes. Cet article explorera diverses méthodes de gestion du cycle de vie de Goroutine, notamment :

1. Utiliser context.Context context.Context

context.Context 提供了一种在 Goroutine 内传播取消和截止日期信号的机制。要使用它来管理 Goroutine 的生命周期,可以使用以下步骤:

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    go func() {
        // Goroutine 的代码
    }()

    // 等待 Goroutine 完成,或超时。
    select {
    case <-ctx.Done():
        fmt.Println("Goroutine 已取消或超时。")
    }
}
Copier après la connexion

2. 使用 sync.WaitGroup

sync.WaitGroup

context.Context fournit un moyen de gérer Goroutine. cycle de vie Mécanismes de propagation des signaux d’annulation et de date limite. Pour l'utiliser pour gérer le cycle de vie de Goroutine, vous pouvez suivre les étapes suivantes :

package main

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

func main() {
    wg := sync.WaitGroup{}

    // 创建 5 个子 Goroutine
    for i := 0; i < 5; i++ {
        wg.Add(1) // 递增WaitGroup计数,表明正在等待另一个Goroutine完成

        go func(i int) {
            fmt.Printf("Goroutine %d 结束。\n", i)
            wg.Done() // 递减WaitGroup计数,表明Goroutine已完成
        }(i)
    }

    // 等待所有子 Goroutine 完成
    wg.Wait()

    fmt.Println("所有子 Goroutine 都已完成。")
}
Copier après la connexion

2 Utilisez sync.WaitGroup

🎜sync.WaitGroup pour autoriser. Les Goroutines doivent s'attendre les uns les autres, jusqu'à ce qu'ils terminent leurs tâches respectives. Utilisez-le pour gérer le cycle de vie de Goroutine. Vous pouvez attendre dans le Goroutine principal que tous les Goroutines enfants soient terminés. 🎜
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    signals := make(chan struct{})

    // 创建 5 个子 Goroutine
    for i := 0; i < 5; i++ {
        wg.Add(1)

        go func(i int) {
            defer wg.Done() // Goroutine退出时递减WaitGroup计数

            // 等待其他Goroutine完成
            <-signals
            fmt.Printf("Goroutine %d 已完成。\n", i)
        }(i)
    }

    // 等待所有子 Goroutine完成
    wg.Wait()

    // 发送信号标记所有子Goroutine都已完成
    close(signals)

    fmt.Println("所有子 Goroutine 都已完成。")
}
Copier après la connexion
🎜🎜3. Utiliser les canaux 🎜🎜🎜Les canaux peuvent communiquer entre les Goroutines et peuvent également être utilisés pour gérer leurs cycles de vie. Une goroutine maître peut attendre que toutes les goroutines enfants soient terminées en envoyant un signal à un canal qui marque la goroutine comme terminée. 🎜rrreee

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal