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.
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!