假设你有多个作业通道,你想先处理某个特定通道的作业,因为它们更重要。在下面的例子中,我们同时将作业放入两个通道。重要的作业进入urgentJobs 通道,不重要的作业进入trivialJobs 通道。只要urgentJobs 通道有作业,listener 就会首先处理它,否则就会落回trivialJobs 通道,所以从技术上讲,trivialJobs 通道的作业往往要等待。
例子
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