Maison >développement back-end >Golang >Golang Select ne bloque-t-il pas ?
select est un mot-clé couramment utilisé dans le langage Go. Il est utilisé pour surveiller les opérations IO liées aux canaux. Lorsque des opérations IO se produisent, les actions correspondantes sont déclenchées.
S'il existe plusieurs cas pouvant être exécutés, Select en sélectionnera un de manière aléatoire et équitable pour l'exécution. D'autres ne seront pas exécutés. (Apprentissage recommandé : go)
Sinon :
S'il y a une clause par défaut, l'instruction est exécutée.
Sans la clause par défaut, select bloquera jusqu'à ce qu'une communication puisse s'exécuter ; Go ne réévaluera pas le canal ou la valeur.
Utilisation de base
//select基本用法 select { case <- chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2 <- 1: // 如果成功向chan2写入数据,则进行该case处理语句 default: // 如果上面都没有成功,则进入default处理流程
Si une ou plusieurs opérations d'E/S peuvent être effectuées, le système d'exécution Go en sélectionnera une au hasard pour l'exécution, sinon, s'il y a une branche par défaut, l'instruction de branche par défaut est exécutée. S'il n'y a pas de valeur par défaut, l'instruction select se bloquera jusqu'à ce qu'au moins une opération IO puisse être effectuée
start := time.Now() c := make(chan interface{}) ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(4*time.Second) close(c) }() go func() { time.Sleep(3*time.Second) ch1 <- 3 }() go func() { time.Sleep(3*time.Second) ch2 <- 5 }() fmt.Println("Blocking on read...") select { case <- c: fmt.Printf("Unblocked %v later.\n", time.Since(start)) case <- ch1: fmt.Printf("ch1 case...") case <- ch2: fmt.Printf("ch1 case...") default: fmt.Printf("default go...") }
Exécutez le code ci-dessus depuis l'heure actuelle. est toujours inférieur à 3 secondes. Par conséquent, le programme actuel s'exécutera par défaut.
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!