26/05/2020 - GO
Birden fazla iş kanalınız olduğunu ve önce belirli bir kanaldaki işleri işlemek istediğinizi varsayalım, çünkü bunlar daha önemlidir. Aşağıdaki örnekte, işleri her iki kanala aynı anda yerleştiriyoruz. Önemli işler urgentJobs
kanalına, önemsiz işler trivialJobs
kanalına gider. urgentJobs
kanalında bir iş olduğu sürece, dinleyici önce onu işler, aksi takdirde trivialJobs
kanalına geri döner, bu nedenle teknik olarak trivialJobs
kanalındaki işler beklemeye alınırlar.
package main
import (
"fmt"
"time"
)
func main() {
urgentJobs := make(chan int)
trivialJobs := make(chan int)
go listener(urgentJobs, trivialJobs)
go func() {
for i := 1; i <= 10; i++ {
trivialJobs<- i
}
}()
go func() {
for i := 1; i <= 10; i++ {
urgentJobs<- i
}
}()
go func() {
for i := 1; i <= 10; i++ {
urgentJobs<- i
}
}()
time.Sleep(5*time.Second)
}
func listener(urgentJobs <-chan int, trivialJobs <-chan int) {
for {
select {
case job := <-urgentJobs:
urgent(job)
default:
select {
case job := <-urgentJobs:
urgent(job)
case job := <-trivialJobs:
trivial(job)
}
}
}
}
func urgent(job int) {
fmt.Println("URG:", job)
}
func trivial(job int) {
fmt.Println("TRV:", job)
}
TRV: 1
TRV: 2
URG: 1 *
URG: 1 *
URG: 2 *
URG: 2 *
URG: 3 *
URG: 3 *
URG: 4 *
URG: 4 *
URG: 5 *
URG: 5 *
URG: 6 *
URG: 6 *
URG: 7 *
URG: 7 *
URG: 8 *
URG: 8 *
URG: 9 *
URG: 9 *
URG: 10 *
URG: 10 *
TRV: 3
TRV: 4
TRV: 5
TRV: 6
TRV: 7
TRV: 8
TRV: 9
TRV: 10