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

在这里插入图片描述

发布了123 篇原创文章 · 获赞 156 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_17308321/article/details/102806024
今日推荐