Maison >développement back-end >Golang >Pourquoi mon « Canal d'attente d'attente » personnalisé ne fonctionne-t-il pas et comment puis-je le faire fonctionner ?
Lorsque l'éditeur php Xiaoxin utilise le "canal d'attente d'expiration" personnalisé, vous pouvez rencontrer une situation où il ne fonctionne pas. Cela peut être dû à certains problèmes courants, tels qu'une configuration incorrecte ou des problèmes de codage. Afin de faire fonctionner le « délai d'attente d'attente du canal » personnalisé, nous pouvons adopter certaines solutions de contournement. Tout d’abord, nous devons nous assurer que le canal et le délai d’attente sont correctement configurés. Deuxièmement, nous pouvons vérifier s'il y a des bugs ou des problèmes de logique dans le code qui pourraient entraîner le délai d'attente pour que le canal ne fonctionne pas. Enfin, nous pouvons également envisager d'utiliser d'autres technologies ou outils connexes pour traiter les problèmes d'attente d'expiration, comme l'utilisation de bibliothèques d'empaquetage ou l'utilisation de minuteries pour surveiller et gérer les situations d'expiration. Grâce à ces méthodes, nous pouvons faire fonctionner correctement le « canal d'attente d'expiration » personnalisé et améliorer les performances et la stabilité de notre application.
J'essaie de créer mon propre "délai d'expiration de chaîne" personnalisé. Plus précisément, la fonction time.after
qu'il contient. En d'autres termes, j'essaie de mettre en œuvre ceci :
select { case v := <-c: fmt.println("value v: ", v) case <-time.after(1 * time.second): fmt.println("timeout") }
Mais malheureusement, j'ai rencontré un problème.
Ma mise en œuvre est :
func waitFun(wait int) chan int { time.Sleep(time.Duration(wait) * time.Second) c := make(chan int) c <- wait return c } func main() { c := make(chan int) go func() { time.Sleep(3 * time.Second) c <- 10 }() select { case v := <-c: fmt.Println("Value v: ", v) case <-waitFun(1): fmt.Println("Timeout") } time.Sleep(4 * time.Second) }
Pour une raison quelconque, cela ne fonctionne pas. L'erreur est : tous les goroutines sont en veille - impasse !
. Je sais qu'à un moment donné, toutes les goroutines (principales et celles introduites avec des fonctions anonymes) se mettent en veille, mais est-ce la raison du bug ou autre chose ? Je veux dire, ce n'est pas "un sommeil infini" ou "une attente infinie de quelque chose", donc ce n'est pas une impasse, n'est-ce pas ? De plus, utiliser all goroutine 正在休眠 - 死锁!
。我知道在某个时刻,所有 goroutine(main 和用匿名函数引入的 goroutine)都会进入睡眠状态,但这是错误的原因还是其他原因?我的意思是,这不是“无限睡眠”或“无限等待某事”,所以这不是死锁,对吧?另外,使用 time.after
也会让 goroutine 休眠,对吗?我需要更改什么才能使我的程序正常工作?
select
语句将在运行时评估所有情况,因此此代码实际上会等待 waitfun
返回,然后才开始侦听任何通道。您必须更改 waitfun
fera également dormir la goroutine, n'est-ce pas ? Que dois-je changer pour que mon programme fonctionne ?
select
évaluera tous les cas au moment de l'exécution, donc ce code attendra en fait le retour de waitfun
avant de commencer à écouter des chaînes. Vous devez changer waitfun
pour renvoyer la chaîne immédiatement : 🎜
func waitFun(wait int) chan int { c := make(chan int) go func() { time.Sleep(time.Duration(wait) * time.Second) c <- wait }() return c }
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!