Comprendre le comportement du sommeil et de la sélection en Go
Lors de l'exécution d'opérations de blocage telles que l'attente d'une durée donnée ou la réception de données de canaux, Go utilise diverses techniques pour gérer la planification des goroutines. Le comportement de ces opérations varie en fonction de la méthode spécifique utilisée. Explorons les différences entre ces approches.
time.Sleep
time.Sleep suspend la goroutine actuelle pendant une durée spécifiée, permettant au processeur d'effectuer d'autres tâches. En interne, time.Sleep interagit avec le runtime Go pour créer une minuterie avec une fonction de rappel. Lorsque le minuteur expire, le rappel réveille la goroutine endormie en invoquant goready.
time.NewTicker
time.NewTicker crée un objet *Ticker qui génère un canal qui les signaux tic-tac à un intervalle spécifique. Le téléscripteur utilise en interne une fonction de rappel runtime.timer qui envoie l'heure actuelle sur son canal à l'expiration. L'attente/programmation se produit pendant l'opération de réception du canal.
Blocage de la réception (<- chan)
Le blocage des réceptions sur les canaux met en pause la goroutine jusqu'à ce que les données soient disponibles ou le canal est fermé. Cette opération est implémentée par chanrecv, qui appelle finalement goparkunlock pour garer la goroutine afin que d'autres goroutines puissent l'exécuter.
Consommation comparative des ressources
En supposant que le canal otherChan dans votre exemple reste vides, les trois options présentent des modèles de consommation de ressources différents. time.Sleep est le plus efficace, suivi de time.NewTicker. Le blocage de la réception (<- chan) entraîne une surcharge supplémentaire en raison de la gestion des canaux et des opérations de synchronisation potentielles. Cependant, les canaux offrent une plus grande flexibilité et permettent des modèles de communication plus complexes.
Résumé
En termes de bas niveau, time.Sleep interagit directement avec le runtime pour garer le goroutine jusqu'à ce qu'un temps spécifié s'écoule. time.NewTicker utilise un rappel de minuterie qui signale les événements de tick sur son canal, l'attente réelle se produisant pendant l'opération de réception depuis le canal. Le blocage des opérations de réception suspend la goroutine jusqu'à ce que les données soient disponibles, ce qui permet des scénarios de communication plus complexes mais entraîne potentiellement une utilisation plus élevée des ressources.
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!