Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

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.


Örnek


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)
}

Test


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