在多线程并发请求Api的场景中,如何控制每个线程的qps
想了一段时间,给出代码Demo
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- typedef struct qps_s{
- int count;
- unsigned int second;
- }qps_t;
- pthread_key_t tdata;
- qps_t qps_data;
- int push_timestamp() {
- time_t tt;
- return time(&tt);
- }
- void *thread_data_del(void *tdata){
- if(tdata){
- free(tdata);
- printf("free\n");
- }
- }
- void doing(){
- qps_t *qps_data = (qps_t *)pthread_getspecific(tdata);
- //说明还没有设置过
- if(!qps_data){
- qps_data = (qps_t *)calloc(, sizeof(qps_t));
- qps_data->count = ;
- qps_data->second = push_timestamp();
- pthread_setspecific(tdata, qps_data);
- }
- while(){
- int now_time = push_timestamp();
- if(now_time == qps_data->second){
- //触发了qps限制
- if(qps_data->count >= ){
- usleep();
- continue;
- }
- //没有触发限制
- else{
- qps_data->count++;
- break;
- }
- }else{
- //时间不相同,说明qps限制肯定没问题
- qps_data->count = ;
- qps_data->second = now_time;
- break;
- }
- }
- printf("request some api => %d, %d\n", qps_data->second, qps_data->count);
- }
- void *worker(void *argv){
- int i;
- for(i = ; i < ; i++){
- doing();
- }
- }
- int main(){
- pthread_t pid1, pid2;
- pthread_key_create(&tdata, (void *)(void *)thread_data_del);
- pthread_create(&pid1, NULL, worker, NULL);
- pthread_join(pid1, NULL);
- pthread_key_delete(tdata);
- return ;
- }
效果
- [work@dev news_push/]valgrind --tool=memcheck ./a.out
- ==== Memcheck, a memory error detector
- ==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
- ==== Using Valgrind-3.10. and LibVEX; rerun with -h for copyright info
- ==== Command: ./a.out
- ====
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- request some api => ,
- free
- ====
- ==== HEAP SUMMARY:
- ==== in use at exit: bytes in blocks
- ==== total heap usage: allocs, frees, bytes allocated
- ====
- ==== All heap blocks were freed -- no leaks are possible
- ====
- ==== For counts of detected and suppressed errors, rerun with: -v
- ==== ERROR SUMMARY: errors from contexts (suppressed: from )
在多线程并发请求Api的场景中,如何控制每个线程的qps的更多相关文章
- Java多线程并发08——锁在Java中的应用
前两篇文章中,为各位带来了,锁的类型及锁在Java中的实现.接下来本文将为各位带来锁在Java中的应用相关知识.关注我的公众号「Java面典」了解更多 Java 相关知识点. 锁在Java中主要应用还 ...
- Java多线程并发07——锁在Java中的实现
上一篇文章中,我们已经介绍过了各种锁,让各位对锁有了一定的了解.接下来将为各位介绍锁在Java中的实现.关注我的公众号「Java面典」了解更多 Java 相关知识点. 在 Java 中主要通过使用sy ...
- 03.Java多线程并发库API使用2
1.多个线程之间共享数据的方式探讨 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代 ...
- 02.Java多线程并发库API使用
1. 传统线程技术回顾 继承线程与实现Runnable的差异?为什么那么多人都采取第二种方式? 因为第二种方式更符合面向对象的思维方式.创建一个线程,线程要运行代码,而运行的代码都封装到 ...
- 04.Java多线程并发库API使用3
1.java5的Semaphere同步工具 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数 ...
- CountDownLatch实现多线程并发请求
package com.test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Dat ...
- c++多线程并发学习笔记(0)
多进程并发:将应用程序分为多个独立的进程,它们在同一时刻运行.如图所示,独立的进程可以通过进程间常规的通信渠道传递讯息(信号.套接字..文件.管道等等). 优点:1.操作系统在进程间提供附附加的保护操 ...
- dubbo协议下的单一长连接与多线程并发如何协同工作
上班的路上突然就冒出了这么个问题:既然在dubbo中描述消费者和提供者之间采用的是单一长连接,那么如果消费者端是高并发多线程模型的web应用,单一长连接如何解决多线程并发请求问题呢? 其实如果不太了解 ...
- JAVA复习笔记之多线程并发
前言:多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,还是值得深入研究一下 概念: 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用 ...
随机推荐
- Bootstrap人民币玩家攻略
用bootstrap及其它基于它的框架,做了多次网站大改版~对bootstrap的特点有了越来越深的了解~从一开始接触时觉得超级鸡肋,到后来觉得方便,再到后来觉得还是能不用就别用了~为什么这么说?我们 ...
- 在idea中maven项目jdk编译version总是跳到1.5
bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...
- 利用Python进行数据分析(11) pandas基础: 层次化索引
层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集 以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引S ...
- Effective前端1:能使用html/css解决的问题就不要使用JS
div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...
- Windows下删除.svn文件夹的最简易方法
建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCA ...
- org.apache.log4j.Logger详解
org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...
- PHP flush()与ob_flush()的区别
buffer ---- flush()buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区 ...
- 设计模式-代理模式(Proxy Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...
- 12款简化 Web 开发的 JavaScript 开发框架
前端框架简化了开发过程中,像 Bootstrap 和 Foundation 就是前端框架的佼佼者.在这篇文章了,我们编制了一组新鲜的,实用的,可以帮助您建立高质量的 Web 应用程序的 JavaScr ...
- switch语句的妙用
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console. ...