在Golang中实现通道内优先选择的实例

96 阅读1分钟

假设你有多个作业通道,你想先处理某个特定通道的作业,因为它们更重要。在下面的例子中,我们同时将作业放入两个通道。重要的作业进入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