Maison > développement back-end > Golang > le corps du texte

Comment contrôler le cycle de vie des coroutines Golang ?

WBOY
Libérer: 2024-05-31 18:05:00
original
1026 Les gens l'ont consulté

Contrôler le cycle de vie d'une coroutine Go peut se faire des manières suivantes : Créer une coroutine : Utilisez le mot-clé go pour démarrer une nouvelle tâche. Terminez les coroutines : attendez que toutes les coroutines soient terminées, utilisez sync.WaitGroup. Utilisez les signaux de fermeture de canal. Utilisez le contexte context.Context.

如何控制 Golang 协程的生命周期?

Comment contrôler le cycle de vie des coroutines Go ?

Dans le langage Go, les coroutines (également appelées Goroutines) sont des organes d'exécution simultanés légers utilisés pour effectuer des tâches spécifiques sans bloquer le thread principal. La gestion du cycle de vie des coroutines est essentielle pour écrire du code parallèle robuste et maintenable.

Créer une coroutine

Utilisez le mot-clé go pour créer une coroutine. Il démarre une nouvelle tâche en arrière-plan afin que le thread principal puisse poursuivre son exécution. go 关键字创建协程。它在后台启动一个新的任务,使主线程可以继续执行。

go func() {
    // 执行任务
}
Copier après la connexion

终止协程

无法直接终止协程,但有以下方法可以间接达到此目的:

等待所有协程完成

使用 sync.WaitGroup 同步任务完成:

import "sync"

var wg sync.WaitGroup

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            // 执行任务
            wg.Done()
        }(i)
    }
    wg.Wait()
}
Copier après la connexion

使用通道关闭信号

使用通道向协程发送"关闭"信号:

func main() {
    done := make(chan struct{})
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-done:
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    close(done) // 向所有协程发送"关闭"信号
}
Copier après la connexion

使用上下文

使用 context.Context

import "context"

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-ctx.Done():
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    cancel() // 取消上下文
}
Copier après la connexion

Terminaison des coroutines

Impossible de terminer les coroutines directement, mais il existe les méthodes suivantes pour atteindre cet objectif indirectement :

Attendez que toutes les coroutines se terminent

Utilisez sync.WaitGroup</code > pour synchroniser Tâche terminée : 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:go;toolbar:false;'>package main import &quot;fmt&quot; import &quot;time&quot; func main() { // 使用信道告诉协程何时退出 stop := make(chan struct{}) // 创建 5 个协程 for i := 0; i &lt; 5; i++ { go func(i int) { for { // 检查是否已经收到退出信号 select { case &lt;-stop: fmt.Printf(&quot;协程 %d 已退出\n&quot;, i) return default: fmt.Printf(&quot;协程 %d 正在运行\n&quot;, i) time.Sleep(time.Second) } } }(i) } // 运行 5 秒,然后发送退出信号 time.Sleep(time.Second * 5) close(stop) // 等待所有协程退出 time.Sleep(time.Second * 1) }</pre><div class="contentsignin">Copier après la connexion</div></div><h4>Utiliser le signal de fermeture du canal</h4>🎜Utiliser le canal pour envoyer le signal "fermer" à la coroutine : 🎜rrreee<h4>Utiliser le contexte</h4>🎜Utiliser <code>context.Context Gérer l'exécution de la coroutine Lorsque le contexte est annulé, la coroutine se terminera également : 🎜rrreee🎜Cas pratique🎜🎜Ce qui suit est un cas pratique utilisant le signal de fermeture de canal :🎜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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!