Maison  >  Article  >  développement back-end  >  Implémentation de la fonction Golang non réentrante

Implémentation de la fonction Golang non réentrante

(*-*)浩
(*-*)浩original
2019-12-17 13:53:132709parcourir

Implémentation de la fonction Golang non réentrante

Une fonction non réentrante est une fonction qui ne peut être exécutée qu'une seule fois à tout moment, quel que soit le nombre de fois où elle est appelée et le nombre de goroutines.

Un service interroge certaines conditions et surveille certains statuts chaque seconde. Nous voulons que chaque état soit vérifié indépendamment sans blocage.

L'implémentation peut ressembler à ceci : nous choisissons d'exécuter chacun dans sa propre vérification de statut goroutine afin que CheckAnotherStatus() n'attende pas la fin de CheckSomeStatus(). Chaque vérification prend généralement peu de temps, bien moins d'une seconde. Mais que se passe-t-il si CheckAnotherStatus() lui-même prend plus d’une seconde à s’exécuter ? Il peut y avoir un retard inattendu du réseau ou du disque qui affecte le temps d'exécution de la vérification.

Est-il judicieux d'exécuter une fonction deux fois en même temps ? Sinon, nous voulons qu'il soit non réentrant.

Fonctions bloquantes et non réentrantes

Un moyen simple d'empêcher une fonction de s'exécuter plusieurs fois est d'utiliser sync.Mutex.

En supposant que nous nous soucions uniquement d'appeler cette fonction à partir de la boucle ci-dessus, nous pouvons implémenter le verrou depuis l'extérieur de la fonction :

func main() {
    tick := time.Tick(time.Second)     
    go func() {         
        for range tick {             
            go CheckSomeStatus()             
            go CheckAnotherStatus()         
        }     
    }() 
}

Le code ci-dessus garantit CheckAnotherStatus () Non effectué par plusieurs itérations de la boucle. Lorsque CheckAnotherStatus() était précédemment exécuté, toutes les itérations ultérieures de la boucle seraient bloquées par le mutex.

La solution de blocage a les propriétés suivantes :

Elle assure autant d'appels à "CheckAnotherStatus()" que de nombre d'itérations de boucle.

En supposant un blocage de l'exécution de "CheckAnotherStatus()", les itérations suivantes entraînent des demandes d'appel de la même fonction.

Fonction de rendement non réentrant

Cela n'a probablement pas de sens de faire le point pour les 10 prochains appels dans notre histoire de vérification de l'état. Une exécution bloquée de CheckAnotherStatus() se termine, les 10 appels s'exécutent soudainement, séquentiellement, et peuvent être terminés dans la seconde suivante, avec 10 vérifications identiques terminées dans la même seconde.

Une autre solution est de se rendre. Une solution rentable est :

Abandonner l'exécution de "CheckAnotherStatus()" si elle a déjà été exécutée.

Exécutera au plus une exécution de "CheckAnotherStatus()".

Moins d'appels à "CheckAnotherStatus()" peuvent réellement être exécutés par rapport au nombre d'itérations de boucle.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn