golang à l'aide des dépassements de délais avec les canaux
Je suis en utilisant des goroutines/canaux de vérifier si la liste des url sont accessibles. Voici mon code. Cela semble toujours retourner la valeur true. Pourquoi est-ce que le délai de cas de ne pas arriver exécuté? L'objectif est de retour faux, même si l'une des url n'est pas accessible
import "fmt"
import "time"
func check(u string) bool {
time.Sleep(4 * time.Second)
return true
}
func IsReachable(urls []string) bool {
ch := make(chan bool, 1)
for _, url := range urls {
go func(u string) {
select {
case ch <- check(u):
case <-time.After(time.Second):
ch<-false
}
}(url)
}
return <-ch
}
func main() {
fmt.Println(IsReachable([]string{"url1"}))
}
OriginalL'auteur Kamal | 2014-05-10
Vous devez vous connecter pour publier un commentaire.
check(u)
va dormir dans le actuel goroutine, c'est à dire celui qui exécutefunc
. Leselect
instruction est uniquement exécuter correctement une fois qu'il retourne, et à ce moment là, les deux branches sont exécutables, et le runtime peut choisir celle qui lui plaît.Vous pouvez le résoudre en exécutant
check
à l'intérieur encore une autre goroutine:Il semble que vous voulez vérifier l'accessibilité d'un ensemble d'Url, et retourne true si l'un d'entre eux est disponible. Si le délai d'attente est long par rapport au temps qu'il faut pour faire tourner une goroutine, vous pouvez simplifier ce en ayant juste un délai d'attente pour toutes les Url ensemble. Mais nous devons nous assurer que le canal est assez grand pour contenir les réponses de tous les contrôles, ou ceux qui ne le sont pas "gagner" va bloquer à jamais:
OriginalL'auteur Thomas
La raison de ce qui renvoie toujours vrai, c'est que vous appelez
check(u)
au sein de votreselect
déclaration. Vous devez appeler dans un aller routine et ensuite utiliser un select, soit d'attendre le résultat ou le délai d'attente.Dans le cas où vous souhaitez vérifier l'accessibilité de plusieurs Url en parallèle, vous avez besoin de restructurer votre code.
D'abord créer une fonction qui vérifie l'accessibilité d'une URL:
Puis appeler cette fonction à partir d'une boucle:
Jouer
OriginalL'auteur Sebastian
changer la ligne
à
Vous n'avez ouvert un asynchrone (= non bloquant) de canal, mais vous avez besoin d'un blocage de canal pour le faire fonctionner.
OriginalL'auteur ABri