并发小工具

简介:

其实就是多线程构造多个请求,请求同一个地址,在网站测试的时候还是能用上的,有的时候方法在同一时间只能被一个线程访问,用这个工具就可以测试的方法是不是真的是在同一时间只能被一个线程访问,在处理订单的时候用处就大了,如银行订单,支付宝订单,骏卡订单等,我们都知道一个订单只能被处理一次,也就是说在同一时间只能有一个线程处理这个订单,等这个线程处理完之后,才能让其他线程访问,等这个线程处理完之后,其他线程在来访问,就直接提示订单的处理结果,用这个工具测试就很方便了,因为他是多个线程同时访问的吗!

前段时间CSDN泄密的原因,大家都说CSDN的技术很烂,我当时就做了个很简单的工具,就是不停的请求CSDN的网站,响应速度还行,不过跟百度的响应速度比起来还是很有距离,同时发现CSDN统计博客的浏览数量有点坑爹,下图中的那篇博客是我写得最开心的,因为思考和分析得过程让我很爽。但在CSDN的浏览量也就1000左右,用这个小工具这么一测,访问量就变成26299,要实现这个访问量也就几分钟。页面刷新一次访问量就增加一次,当然他至少有点真实性,为了增加自己博客的访问量的朋友就不用自己刷新了,用我这个小工具吧,但这个工具对博客园不起作用,博客园用了缓存,而且缓存时间还蛮长,在缓存指定的时间内程序的后台代码是不会执行的,所有的显示信息都来自你本地缓存的内容。所以不停的访问博客园的页面也没有用。

开始的时候只是一个刷博客的工具,没什么用,但是最近做的一个东西涉及到订单处理问题,保证一个订单只能被处理一次,然而有的时候,一个订单可能同时有多个请求,当然不能一个订单处理多次啦,于是自己就改造了一下那个刷博客的小工具,让他能实现并发请求,经过这个小工具的测试,程序还Ok。并发小工具截图如下:

并发小工具的源码就很简单了,下面随便贴出部分代码,源码下载。本博客作者:陈太汉

复制代码
        //发送请求
private void Action()
{
while (requestCount > 0)
{
if (!IsOK)
{
return;
}
Post(2500, txtUrl.Text.Trim());
}
}

//终止所有子线程
private void AbortThread()
{
if (threadList != null && threadList.Count > 0)
{
foreach (Thread t in threadList)
{
t.Abort();
}
threadList.Clear();
threadList = null;
}
}

//启动所有线程
private void Start()
{
AbortThread();//清理线程列表
int count = int.Parse(txtThreadCount.Text.Trim());
threadList = new List<Thread>(count);
for (int i = 0; i < count; i++)
{
Thread thread = new Thread(Action);
thread.IsBackground = true;
threadList.Add(thread);
thread.Start();
}
}

//发送请求
private void Post(int timeout, string url)
{
using (Stream s = GetPostStream(timeout, url))
{
if (s == null)
{
++FailCount;
}
else
{
++SucCount;
}
--requestCount;
}
}

//获取存储指定页面数据的流
private Stream GetPostStream(int timeout, string url)
{
try
{
if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase))
{
url = "http://" + url;
}
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(url);//如果地址不存在或是不能访问,会报异常
myReq.Timeout = timeout;
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
return HttpWResp.GetResponseStream();
}
catch
{
return null;
}
}

//url验证url是否存在
private bool CheckUrl(string url)
{
using (Stream myStream = GetPostStream(1200, url))
{
if (myStream == null)
{
return false;
}
using (StreamReader sr = new StreamReader(myStream, Encoding.Default))
{
if (sr.Peek() > -1)
{
return true;
}
}
return false;
}
}
复制代码

看云风博客关于解决12306并发问题的启发:我现在做骏卡接口,可能出现并发问题,就是一个订单可能向我们的接口发送多个请求,而我现在做的方法是去数据库中对应的表验证,看订单是否存在,如果存在就提示一下,如果不存在按流程走,但是这个样每来一个订单我都需要去数据库查,如果我在内存中维护一个订单集合,这样就能很快解决判断订单是否存在的问题,惯性思维太严重了,什么都去数据库查,这样的性能是最差的,其实很多问题在内存中就可以搞定的,最近还有一个特别感受,不要做井底之蛙,多看牛人的东西收获真的比自己埋头写代码进步快很多,其实很多时候我写的程序性能差,效率低都是因为方法的原因,没有找到好的方法,没有灵光一闪的感觉,用了最烂的方法解决问题(这段文字是前些天写的,跟博客的主题关系不大)

作者:陈太汉

博客:http://www.cnblogs.com/hlxs/


本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2012/01/18/2325378.html

目录
相关文章
|
12月前
|
存储 Linux 调度
确保并发执行的安全性:探索多线程和锁机制以构建可靠的程序
在当今计算机系统中,多线程编程已成为常见的需求,然而,同时也带来了并发执行的挑战。为了避免数据竞争和其他并发问题,正确使用适当的锁机制是至关重要的。通过阅读本文,读者将了解到多线程和锁机制在并发编程中的重要性,以及如何避免常见的并发问题,确保程序的安全性和可靠性。通过实际案例和代码示例来说明如何正确地使用多线程和锁机制来构建可靠的程序。
45 1
|
2月前
|
监控 网络协议 API
Typhoeus库在处理大量并发请求时的优化技巧
Typhoeus库在处理大量并发请求时的优化技巧
|
3月前
|
消息中间件 JavaScript Java
关于如何提高Web服务端并发效率的异步编程技术
【7月更文挑战第4天】异步编程技术是提升Web服务并发效率的关键。包括: 1. 事件驱动编程,如Node.js的事件回调; 2. 异步任务队列,利用消息队列如RabbitMQ或Kafka解耦处理; 3. 异步I/O,Java的CompletableFuture实现非阻塞操作; 4. 协程,Python的async/await提供同步感的异步执行; 5. 线程/进程池,通过固定资源池管理并发任务,减少系统开销。 这些技术能增强系统性能和响应速度。然而,异步编程也需考虑正确性、稳定性和调试挑战。
|
3月前
|
Java 测试技术 容器
多线程编程基础与并发问题解决方案
多线程编程基础与并发问题解决方案
|
缓存 Java 容器
【并发技术10】线程并发库的使用
【并发技术10】线程并发库的使用
|
Linux Go 开发工具
高并发 多线程批量ping工具 nbping简介和使用
nbping是为解决局域网大批量IP实例或主机探活,采用go协程并发处理,可以自定义并发的协程数量和输出结果.效率远高于现有的批量ping工具.
2646 0
|
Java 关系型数据库 MySQL
《性能优化》并发与并行
性能优化系列第一篇主要给大家科普了一些性能相关的数字,为大家建立性能的初步概念。第二篇给大家介绍了支撑淘宝双十一这种达到百万QPS项目所需的相关核心技术。 本文带来的是性能优化中的第一利器:并发与并行。
278 0
《性能优化》并发与并行
|
存储 负载均衡 算法
【值得收藏】你想知道的并发都在这里【传统并发】与【Go并发】
参考书籍及网站 《计算机操作系统原理分析(第二版)》 《Go程序设计语言》 《Go并发编程实战》 https://medium.com/rungo/anatomy-of-channels-in-go-concurrency-in-go-1ec336086adb
179 0
【值得收藏】你想知道的并发都在这里【传统并发】与【Go并发】
|
Shell 调度 Java
带你读《并发模式与应用实践》之一:并发简介
本书解释了如何利用并行体系结构的不同特性,使代码更快、更高效。首先介绍基本的并发概念,并探索围绕显式锁定、无锁编程、future模式和actor模式。其次,深入讲解不同的并发模型和并行算法,并将它们应用到不同的场景中,以挖掘应用程序的真正潜力。本书将带读者了解多线程设计模式,如主/从模式,Leader/Followers模式,map-reduce模式,以及监视器模式,还将帮助读者学习使用这些模式的实际编码。
|
Java 调度 容器
多线程之并发基础(三)
线程是轻量级的进程,进程可以说是线程的容器。线程是程序执行的最小单位。使用多线程而不是使用多进程进行并发程序的设计,因为线程的切换和调度成本远远小于进程。