[golang]select优先级
程序员文章站
2024-02-25 15:00:21
...
golang 的select 用来同步处理任务非常便利也十分安全,类似于c的epoll和c++里面的eventloop模型。
如果select中的通道chan是无缓冲通道,那么很有可能丢失数据,两个定时任务同时发生时,可能只是随机执行了其中一个,另一个通道数据可能就丢失了,那么可以增加优先级来规避这个问题。
除了数据丢失外,配置优先级主要还是为了解决随机性问题,如果一个缓冲通道的缓冲区一直是满的,另外一个通道的关键数据就有可能得不到及时处理,例如退出任务信号等等。
方式一
缺点:会不停的执行default,浪费cpu.
package main
import (
"fmt"
"time"
)
func default_test1() {
t1 := time.NewTicker(1*time.Second)
t2 := time.NewTicker(2*time.Second)
t3 := time.NewTicker(3*time.Second)
for {
select{
case <- t3.C:
fmt.Println("tick3:",time.Now())
case <- t2.C :
fmt.Println("tick2:",time.Now())
default:
select {
case <- t1.C :
fmt.Println("tick1:",time.Now())
default:
fmt.Println("default:",time.Now())
}
}
}
}
方式二
func default_test2() {
t1 := time.NewTicker(1*time.Second)
t2 := time.NewTicker(2*time.Second)
t3 := time.NewTicker(3*time.Second)
for {
select{
case <- t1.C :
fmt.Println("tick1:",time.Now())
case <- t2.C :
fmt.Println("tick2:",time.Now())
default:
select {
case <- t1.C :
fmt.Println("tick1:",time.Now())
case <- t2.C :
fmt.Println("tick2:",time.Now())
case <- t3.C:
fmt.Println("tick3:",time.Now())
}
}
}
}
上一篇: css选择器优先级及权重计算
下一篇: eclipse启动tomcat卡死