Semaphore 信号量限流,这东西真管用吗?用事实说话!

最近参与公司的服务治理项目,主要目的是为了保证生产服务高可用性,以及高稳定性。

为了更好的参与的这个项目,这段时间一直在充电学习这方面的相关知识,包括限流,熔断,服务降级等等。

那在学习限流的时候,看到网上很多文章中直接使用了JDK 中 Semaphore 实现了限流器。

虽然到达的限流的目的,但是实际上其还是存在很大缺陷。

图片

那你如果没有经过完整测试,直接将这套限流方式照搬过来,发到了生产环境,那就等着背这口大锅吧。

好了,今天我们主要来聊聊 Semaphore ,文章主要内容如下图所示:

图片

semaphore

限流的方式有很多,从类型上分类,一般可以分为两种:

  • 并发数限流

  • QPS 限流

并发数限流就是限制同一时刻的最大并发请求数,而 QPS 限流指的是限制一段时间内请求数。

那我们今天的讲的 semaphore 限流其实属于第一类,通过限制并发数,到达限流的目的。

semaphore中文翻译为信号量,它其实是并发领域中一个重要编程模型,几乎所有支持并发编程的语言都支持信号量这个机制。

JDK 并发包下 Semaphore 类就是信号量的实现类,它的模型比较简单,如下图所示:

图片

Semaphore 内部有一个计数器,我们使用的时候,需要提前初始化。

初始化之后,我们就可以调用 acquire方法,获取信号量,这时计数器将会减 1。如果此时计数器值小于 0,则会将当前线程阻塞,并且加入到等待队列,否则当前线程继续执行。

执行结束之后,调用 release方法,释放信号量,计数器将会加 1。那如果此时计数器值的小于或等于0&

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,使用信号程一般如下: 1. 使用semget系统调用创建或获取一个信号集,得到一个信号集标识符。 2. 使用semctl系统调用初始化或控制信号集,例如设置初始值、获取当前值等。 3. 使用semop系统调用进行信号操作,例如加锁、解锁等。 其中,关键的系统调用有: 1. semget:创建或获取一个信号集,并返回信号集标识符。 2. semctl:初始化或控制信号集,例如设置初始值、获取当前值等。 3. semop:进行信号操作,例如加锁、解锁等。 以下是一个使用信号的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int main() { int semid; struct sembuf semop_arg; // 创建或获取信号集 semid = semget(IPC_PRIVATE, 1, IPC_CREAT|0666); if (semid == -1) { perror("semget error"); exit(EXIT_FAILURE); } // 初始化信号集 semctl(semid, 0, SETVAL, 1); // 加锁 semop_arg.sem_num = 0; semop_arg.sem_op = -1; semop_arg.sem_flg = SEM_UNDO; semop(semid, &semop_arg, 1); // 解锁 semop_arg.sem_num = 0; semop_arg.sem_op = 1; semop_arg.sem_flg = SEM_UNDO; semop(semid, &semop_arg, 1); // 删除信号集 semctl(semid, 0, IPC_RMID, 0); return 0; } ``` 在这个示例中,程序使用semget函数创建一个大小为1的信号集,并使用semctl函数将信号初始值设置为1。然后,程序使用semop函数进行加锁和解锁操作。最后,程序使用semctl函数删除信号集。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值