l'éditeur php Banana répondra pour vous : Pourquoi docall utilise-t-il gopanic en singleflight ? En singleflight, lorsque plusieurs goroutines demandent la même tâche en même temps, afin d'éviter des exécutions répétées, nous devons utiliser la fonction docall pour garantir qu'une seule goroutine exécute la tâche. Afin de mieux gérer les erreurs lorsqu'une erreur se produit dans une goroutine, nous utilisons la fonction gopanic pour lever une exception. Cela peut rendre l'erreur plus claire et nous faciliter la gestion et le débogage en conséquence. Par conséquent, l’utilisation de gopanic en vol unique peut améliorer la fiabilité et l’efficacité de la gestion des erreurs. C'est pourquoi docall utilise gopanic en vol unique.
Je lisais récemment le code source de Singleflight et j'étais confus au sujet de la ligne 158.
if len(c.chans) > 0 { go panic(e) select {} // Keep this goroutine around so that it will appear in the crash dump. } else { panic(e) }
Pourquoi utiliser gopanic au lieu de panic directement lorsque vous utilisez les chaînes ? La ligne 129 utilise go docall. Dans cette méthode, elle panique et la couche supérieure ne peut pas récupérer, donc go panic ne devrait pas avoir de sens, n'est-ce pas ?
De plus, s'il y a des requêtes simultanées et que le canal n'est toujours pas écrit après la panique, d'autres goroutines ne bloqueront-elles pas également ? Si quelqu'un a la gentillesse de lire et de répondre, je lui en serais très reconnaissant~
Comprenez les implications de conception
gopanic
将导致无法恢复的恐慌。恐慌和 select
Assurez-vous que la goroutine paniquée apparaît ensuite dans le vidage de pile, afin que vous puissiez regarder le vidage de pile et réaliser que quelque chose s'est produit qui n'aurait pas dû se produire.
C'est juste une façon de vous assurer de ne pas vous remettre par inadvertance de quelque chose que vous ne devriez pas.
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!