[golang]select优先级

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

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值