2013-09-06 1 views
13

J'ai trouvé le code suivant dans net/http/httptest et je me demande ce que l'instruction select vide fait dans Go.Que fait un select vide?

go s.Config.Serve(s.Listener) 
if *serve != "" { 
    fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) 
    select {} 
} 

Répondre

8

Un select{} vide des blocs d'instructions indéfiniment dire pour toujours. Il est similaire et en pratique équivalent à une instruction for{} vide.

+0

C'était ma conjecture. Cependant, je le trouve encore sémantiquement gênant, car 'select' suggère une condition et non une boucle. –

+8

AFAIK un vide pour serait intensif sur le cpu (du moins c'est comme ça que les boucles infinies vides fonctionnent dans d'autres langues). Dans l'exemple d'OP, il est probable que select {} soit utilisé pour empêcher la sortie du goroutine principal. – justinas

+3

En langage CSP, le select vide est comme "STOP", un processus qui ne se poursuit jamais. Cela s'apparente à une auto-impasse et j'imagine que ça ne s'emballe pas si souvent. Cependant, la question propose un cas d'utilisation intéressant et authentique pour ce modèle. Une boucle 'for {}' vide est un self-livelock, différent car il consomme des ressources cpu. –

4

L'instruction select vide bloque simplement le goroutine en cours. Pour ce qui est de savoir pourquoi vous feriez cela, voici une raison. Cet extrait est équivalent

if *serve != "" { 
    fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) 
    s.Config.Serve(s.Listener) 
} else { 
    go s.Config.Serve(s.Listener) 
} 

Il est préférable qu'il n'y ait pas de goroutine gaspillée. C'est pire en ce que maintenant il y a la répétition du code. L'auteur optimisé pour moins de répétition de code sur une ressource gaspillée. Notez cependant que le goroutine en bloc permanent est trivial à détecter et peut avoir un coût nul par rapport à la version en double.

7

Sous Mac OS X, dans Go, for { } provoquera le% CPU au maximum, et l'Etat sera running

select { }, d'autre part du processus, ne causera pas le% CPU au maximum, et l'état du processus sera sleeping

Questions connexes