Maison > développement back-end > Golang > Stratégie de planification de la coroutine Golang

Stratégie de planification de la coroutine Golang

WBOY
Libérer: 2024-04-15 18:12:02
original
1250 Les gens l'ont consulté

La planification des coroutines Go a trois stratégies : G0 et G1 : planification préemptive, priorité G1 > G0 et G1 : planification préemptive, priorité G1 > Planification non préemptive : la coroutine s'exécute jusqu'à ce qu'elle abandonne activement les droits d'exécution du processeur.

Stratégie de planification de la coroutine Golang

Stratégie de planification des coroutines Golang

Les coroutines sont des mécanismes de concurrence légers dans Go. La politique de planification détermine la manière dont l'exécution de la coroutine est planifiée. Go propose trois stratégies de planification :

  • G0
  • G1
  • Planification non préemptive

G0 et G1

G0 et G1 sont tous deux des planifications préemptives. Cela signifie qu'une coroutine en cours d'exécution peut être préemptée par une coroutine de priorité plus élevée.

G1 a une priorité plus élevée que G0. Si les deux coroutines sont à l’état exécutable, la coroutine G1 sera exécutée en premier.

Planification non préemptive

La planification non préemptive est non préemptive. Cela signifie que les coroutines en cours d’exécution ne peuvent pas être préemptées. Il continuera à fonctionner jusqu'à ce que l'exécution du processeur soit volontairement cédée.

Cas pratique

Utilisation de G0

package main

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

func main() {
    var wg sync.WaitGroup
    defer wg.Wait()

    for i := 0; i < 2; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            fmt.Printf("协程 %d 在 G0 调度器上执行\n", i)
            runtime.Gosched()
        }(i)
    }
}
Copier après la connexion

Utilisation de la planification non préemptive

package main

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

func main() {
    runtime.LockOSThread()

    for i := 0; i < 2; i++ {
        go func(i int) {
            fmt.Printf("协程 %d 使用非抢占式调度\n", i)
        }(i)
    }
}
Copier après la connexion

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