並發小工具


其實就是多線程構造多個請求,請求同一個地址,在網站測試的時候還是能用上的,有的時候方法在同一時間只能被一個線程訪問,用這個工具就可以測試的方法是不是真的是在同一時間只能被一個線程訪問,在處理訂單的時候用處就大了,如銀行訂單,支付寶訂單,駿卡訂單等,我們都知道一個訂單只能被處理一次,也就是說在同一時間只能有一個線程處理這個訂單,等這個線程處理完之后,才能讓其他線程訪問,等這個線程處理完之后,其他線程在來訪問,就直接提示訂單的處理結果,用這個工具測試就很方便了,因為他是多個線程同時訪問的嗎!

前段時間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/

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM