如何使用线程(池)来模拟请求并发的情况

.Net技术 码拜 9年前 (2015-02-11) 1007次浏览 0个评论
 

有一个接口 比如
里面我接收get过来的id 插入到数据库中.
也就是
sring id=request[“id”];
string sql=”insert into tb values(“”+id+””,getdate())”;
db.exec(sql)
es.write(“ok”)

如果使用客户端模拟的情况 我们可以使用下面的代码
var rs=new webclient().downloadstring(“http://111.222.333.44/api.ashx?id=”+guid.newguid().tostring());
但是如何让这个请求并发执行 也就是很多很多 最少1秒要几万个左右吧..
客户端模拟的情况下 for循环 或者是什么的 好像不行的….
所以 是不是线程池可以解决这个问题? 或者是其他技术?

 
如何使用线程(池)来模拟请求并发的情况
当然 IIS或者其他服务器 能不能接收这样多的并发是另外一回事…现在只考虑客户端如何模拟..
如何使用线程(池)来模拟请求并发的情况
1分
可以用软件啊,loadrunner,或者自己开n多个子线程,把你上面的代码放在子线程里面执行。
如何使用线程(池)来模拟请求并发的情况
引用 2 楼 coolku 的回复:

可以用软件啊,loadrunner,或者自己开n多个子线程,把你上面的代码放在子线程里面执行。

软件就不说了 测试软件很多
至于你后面说的开N个子线程.请问N=几?  或者说 一个4G内存 4核CPU X64系统 最多能开多少个线程?
开辟的时候 本来就是一个一个去开辟去执行的 就更别说”并发”了.
另外我测试了并行中的for速度也没那么快..
pre class=”brush: csharp”>
threadstrat ts=new threadstart(new action(()=>{
  tasks.parallel.for(0,10000,(i)=>{
    new webclient().downloadstring(“”);
  });
}));
thread t=new thread(ts);
t.start
/pre>
不知道这个是否可以 楼下怎么看.

如何使用线程(池)来模拟请求并发的情况
1分
1、默认对同一个hostname的连接数只有两个,因此你要放宽这个限制:
System.Net.ServicePointManager.DefaultConnectionLimit = 100;
2、可以用多线程来做几十几百个的并发。
3、如果是‘1秒几万个’的规模,要用多个机器来做。原因很简单,一台拖拉机是压不垮一台推土机的。
如何使用线程(池)来模拟请求并发的情况
2分
一台机器,5分钟内能执行5000次也就不错了。如果要“1秒钟10000次访问”,你需要用2000台电脑做测试客户端。
几乎所有的“压力测试”都是用来分析“趋势的”,不是真实的。不要以为压力测试数据可以直接看。
如何使用线程(池)来模拟请求并发的情况
2分
线程池技术是用来处理用户的并发的,是模拟不了并发的,模拟并发最好的方法是用,压力测试软件或者负载软件,如果非要自己开发模拟并发,做好自己用thread类,自己控制线程的声明周期,或者用task类,多核编程
如何使用线程(池)来模拟请求并发的情况
2分
用台式机测试服务器,你不用几百台来测试,根本测试不出服务器的极限
因为一定是台式机先挂掉
如何使用线程(池)来模拟请求并发的情况
System.Threading里的Timer就好,会自动给你起线程。你要每秒几万个,就需要几十个每毫秒触发一次的Timer
如何使用线程(池)来模拟请求并发的情况
1分
多线程不代表并发,当前CPU同时能执行几个线程才是你这台电脑真正能够触发并发的数量,否则还是等待轮询的。
如何使用线程(池)来模拟请求并发的情况
1分
7楼说的很有道理,一台pc去测试一台服务器的极限,只能说  呵呵
如何使用线程(池)来模拟请求并发的情况
1分
从内核的并行运算来讲9L说的很有道理,CPU是硬件,必然有极限
但是,当我们new了很多线程,比如几万个,然后遍历start(),为什么CPU使用率并没有明显上升呢?
因为你的测试是基于http, 基于tcp的,系统默认是有连接数限制的,这种网络IO的耗时相比CPU而言太慢了,所以CPU绝大多数时候还是闲着
之前做过类似的测试,在不修改TCP连接数的情况下,用for了2000个线程(中间没有sleep)偶尔会出现连接超时,当然这也要看服务端处理请求的复杂度了
如何使用线程(池)来模拟请求并发的情况
100分
ThreadStart t = new ThreadStart(new Action(() => {
                Parallel.For(1, 500, (i) => {
                      //code
                });
            }));
            Thread tx = new Thread(t);
            tx.IsBackground = true;
            tx.Start();
/pre>

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何使用线程(池)来模拟请求并发的情况
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!