Maison > Article > développement back-end > Pourquoi « TCPListener » de Go n'utilise-t-il pas de canaux pour la concurrence ?
Modèle de concurrence TCP Accept and Go
Question :
Pourquoi TCPListener de Go utilise-t-il un bloquer la méthode Accept() au lieu d'un système basé sur les canaux, comme prévu par l'accent mis par Go sur la concurrence ?
Réponse :
Le modèle de concurrence de Go repose sur des goroutines (threads légers ) géré par le runtime Go. Bien qu'Accept() puisse sembler bloquant, il est finalement géré par le runtime Go, qui sélectionne les goroutines à exécuter. Cela permet une utilisation efficace des ressources système et une mise en œuvre facile des opérations de blocage.
Implémentation de canal personnalisé :
Pour obtenir un système basé sur un canal, vous pouvez créer une goroutine qui accepte continuellement les connexions et les pousse sur un canal. Cela offre la flexibilité d'utiliser select() avec plusieurs sockets de serveur ou de multiplexer l'attente sur Accept() avec d'autres canaux.
Considérations sur la fermeture des canaux :
Notez que si l'un de vos accepteurs rencontre une erreur, vous ne pouvez pas simplement fermer le canal d'acceptation. Les autres accepteurs paniqueront lorsqu'ils tenteront d'y écrire.
Exemple :
<code class="go">newConns := make(chan net.Conn) // For every listener, spawn a goroutine that accepts connections for _, l := range listeners { go func(l net.Listener) { for { c, err := l.Accept() if err != nil { // Handle error newConns <- nil return } newConns <- c } }(l) } // Multiplex the channel with a timer for { select { case c := <-newConns: // Handle new connection or nil (if an acceptor is down) case <-time.After(time.Minute): // Timeout branch } }</code>
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!