Chciałbym posłuchać rutynowo na dwóch kanałach, zablokowanych, gdy oba kanały są opróżnione. Jeśli jednak oba kanały zawierają dane, chcę, aby jeden został usunięty, zanim drugi zostanie obsłużony.Priorytet w obejściu oświadczenia Go select
W poniższym przykładzie roboczym chciałbym, aby cały out
został opróżniony przed obsługą exit
. Używam wersji select
, która nie ma żadnej kolejności priorytetu. Jak mogę obejść ten problem, sprawiając, że wszystkie 10 out-wartości zostaną obsłużone przed wyjściem?
package main
import "fmt"
func sender(out chan int, exit chan bool){
for i := 1; i <= 10; i++ {
out <- i
}
exit <- true
}
func main(){
out := make(chan int, 10)
exit := make(chan bool)
go sender(out, exit)
L:
for {
select {
case i := <-out:
fmt.Printf("Value: %d\n", i)
case <-exit:
fmt.Println("Exiting")
break L
}
}
fmt.Println("Did we get all 10? Most likely not")
}
Pomysł jest bardzo podobny do mojego. Ale prawda, z "kontynuacją", pozbędziesz się potrzeby flagi. Mądry. Cóż, jest to prawdopodobnie równie dobra odpowiedź, jaką mogę założyć. Dzięki! – ANisus
spowoduje to nieskończoną pętlę w pierwszym poleceniu wyboru, jeśli kanał wyjściowy jest zamknięty. – jorelli
jorelli, całkiem prawdziwe. Jeśli chcesz pozwolić wrogim lub zapluskwionym gorsominom na zamknięcie kanału nieoczekiwanie, sprawdzisz status ok na otrzymaniu. – Sonia