go-resiliency源码解析之-semaphore

Semaphore在go-resiliency库中被用来限制并发访问资源的数量,通过一个带缓冲的通道模拟票据系统。Acquire函数用于获取票据,若在设定的超时时间内无法获取,则返回错误。Release函数则用于归还票据,确保资源的有序使用。
摘要由CSDN通过智能技术生成

go-resiliency源码解析之-semaphore

1.什么是semaphore

这个是我问ChatGPT的文档

Semaphore 是一种用于同步进程间共享资源的机制。Semaphore 可以看作是一个计数器,用于保护一定数量的共享资源。当进程需要访问共享资源时,它必须先从 Semaphore 中获取一个许可证,然后才能访问共享资源。当进程完成了对共享资源的访问后,它必须将许可证返还给 Semaphore。Semaphore 可以防止多个进程同时访问共享资源,从而避免了竞争条件的发生,保证了程序的正确性和可靠性。Semaphore 是多进程编程中常用的技术之一。

简单来说信号量是用于并发控制,保护并发资源的一种机制。常用的并发机制有,互斥量,读写锁,信号量这些都是单进程里的锁机制,在分布式系统下还有分布式锁。

2.go-resiliency的semaphore实现

创建一个semaphore需要两个参数:

  • ticket count (一次发放多少张票),协程只有在获取到票据才能访问共享资源。
  • timeout (如果目前没有票,要等多久才有票),超过timeout的等待返回超时。
type Semaphore struct {
	sem     chan struct{}
	timeout time.Duration
}

func New(tickets int, timeout time.Duration) *Semaphore {
	//这里使用chan特性来模拟信号量的票据,创建一个tickets待缓冲的chan
	return &Semaphore{
		sem:     make(chan struct{}, tickets),
		timeout: timeout,
	}
}

//每次在访问共享,需要调用Acquire函数,在Acquire函数里如果能写入chan成功,说明获取到票据
//否则在这里等待,在timeout时间后会超时返回
func (s *Semaphore) Acquire() error {
	select {
	case s.sem <- struct{}{}:
		return nil
	case <-time.After(s.timeout):
		return ErrNoTickets
	}
}

//在使用完资源后需要调用Release返回票据
func (s *Semaphore) Release() {
	<-s.sem
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值