Arrêter l'exécution de Goroutine en cas d'expiration : une limitation du modèle Fork-Join
Dans le modèle de concurrence fork-join de Go, l'exécution de Goroutine ne peut pas être interrompue une seule fois initié. Bien qu'un délai d'attente puisse être défini pour la lecture d'un canal, il n'arrête pas l'exécution des goroutines écrivant sur le canal.
L'exemple expliqué
Dans le code fourni :
- La fonction Find crée un canal tamponné et lance une goroutine pour envoyer une réponse après 10 secondes.
- L'instruction select a deux cas : réception du canal ou expiration après 50 millisecondes.
- La goroutine envoie finalement la réponse même après le délai d'attente, ce qui fait que la sortie souhaitée n'est pas atteint.
Comprendre la limitation
L'incapacité d'interrompre Les goroutines proviennent du modèle fork-join de Go :
- Les goroutines sont dérivées du thread principal et s'exécutent simultanément sans contrôle direct.
- Les points de jonction, tels que les communications de canal, sont les seules instances où la synchronisation se produit.
- Les délais d'attente définis sur les récepteurs de canal n'ont aucun effet sur l'exécution de l'expéditeur goroutines.
Approches alternatives
L'interruption directe n'étant pas possible, des approches alternatives peuvent être utilisées :
-
Annulation de contexte : associez un contexte à la goroutine et annulez-le en cas d'expiration du délai, ce qui amène la goroutine à recevoir des signaux pour terminer.
-
Processus séparé : démarrez la goroutine dans un processus séparé et terminez-le si nécessaire.
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!