Maison  >  Article  >  développement back-end  >  Quand le planificateur Go crée-t-il de nouveaux M et P ?

Quand le planificateur Go crée-t-il de nouveaux M et P ?

王林
王林avant
2024-02-06 09:00:09874parcourir

Quand le planificateur Go crée-t-il de nouveaux M et P ?

Contenu de la question

Je viens d'apprendre le modèle Golang GMP et je comprends maintenant comment les goroutines, les threads du système d'exploitation et le contexte/processeurs Golang coopèrent les uns avec les autres. Mais je ne comprends toujours pas quand M et P seront générés ?

Par exemple, j'ai un code de test pour exécuter certaines opérations sur la base de données, et il y a deux cas de test (deux lots de goroutines) :

func Test_GMP(t *testing.T) {
    for _ = range []struct {
        name string
    }{
        {"first batch"},
        {"second batch"},
    } {
        goroutineSize := 50
        done := make(chan error, goroutineSize)
        for i := 0; i < goroutineSize; i++ {
            go func() {
                // do some databases operations...
                // each goroutine should be blocked here for some time...

                // propogate the result
                done <- nil
            }()
        }

        for i := 0; i < goroutineSize; i++ {
            select {
            case err := <-done:
                assert.NoError(t, err)
            case <-time.After(10 * time.Second):
                t.Fatal("timeout waiting for txFunc goroutine")
            }
        }
        close(done)
    }
}

D'après ma compréhension, si M est créé en cas de besoin. Dans le premier lot de goroutines, 8 (nombre de cœurs virtuels sur ma machine) threads du système d'exploitation seront créés, le deuxième lot ne réutilisera que ces 8 threads du système d'exploitation sans créer de nouveaux threads. Est-ce correct?

Nous serions reconnaissants si vous pouviez fournir plus de documents ou de blogs sur ce sujet.


Bonne réponse


M ne peut être réutilisé que si votre processus n'est pas bloqué ou n'a aucun appel système. Dans votre cas, vous avez des tâches bloquantes dans go func(). Le nombre de M n’est donc pas limité à 8 (le nombre de cœurs virtuels sur ma machine). Le premier lot bloquera et supprimera de P et attendra la fin du processus de blocage pendant qu'un nouveau M est créé associé à P.

Voir ci-dessous pour plus de détails,

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer