好了 昨天说道HttpHelper异步版的实现 今天奉上HttpHelper异步版的压力测试,顺便把昨天的坑给填了。实际使用异步类的过程中,我们需要知道爬虫什么时候爬完了,或者说任务爬干净了。好了 ,这里需要引入计数器。先定义两个接口。
[C#] 纯文本查看 复制代码 public interface ISetRelease
{
void SetRelease(IRelease release);
}
[C#] 纯文本查看 复制代码 public interface IRelease
{
void Release();
}
然后定义一个任务类,用来完成任务。[C#] 纯文本查看 复制代码 public class MyTask : ISetRelease
{
AsyncHttpHelper target = new AsyncHttpHelper();
HttpItem objhttpItem = new HttpItem();
public void DoWork()
{
objhttpItem.URL = "http://myhb.qq.com/f-1001229421-1.htm";
objhttpItem.urlGuid = Guid.NewGuid().ToString();
target.GetHtmlDataAsync(objhttpItem, CallBack);
}
void CallBack(HttpResult resul)
{
TraceDic.RemoveUrl(resul.Guid);
release.Release();
}
IRelease release;
public void SetRelease(IRelease release)
{
this.release = release;
}
}
大家发现了TraceDic.RemoveUrl(resul.Guid);
这句话是干吗的呢,如果大家注意看我的前一篇帖子,就会发现 TraceDic.AddAsyncUrl(objhttpItem.urlGuid, objhttpItem.URL);
好了,这个追踪字典就是用来记录实际使用过程中,记录还有哪些Url仍在爬去的,做Trace用的。实际项目中,当然要干掉了。
现在再来定义一个任务管理器,也不是什么高深的东西了。
[C#] 纯文本查看 复制代码 class MyTaskManager : IRelease
{
private int m_cycleCount = 100;
private int m_count = 0;
object m_lock = new object();
public void DoWork()
{
for (int i = 0; i < m_cycleCount; i++)
{
lock (m_lock)
{
if (m_count >= 7)
Monitor.Wait(m_lock);
m_count++;
Trace.TraceInformation("in m_count " + m_count);
}
MyTask m_task = new MyTask();
m_task.SetRelease(this);
m_task.DoWork();
m_task = null;
GC.Collect();
}
}
public void Release()
{
lock (m_lock)
{
m_count--;
Trace.TraceInformation("Out m_count-- " + m_count);
Trace.TraceInformation(Spider.DataControl.SpiderTrace.TraceDic.GetString());
if (m_count < 7)
Monitor.Pulse(m_lock);
}
}
}
这个任务管理器负责任务的调度。可以控制同时爬取的链接数。好了,这里使用的是混合构造Monitor,大家对于.net中的线程同步如果有问题,还请自行Google好了,这里不重复介绍。
好了,接下来编写单元测试。
[C#] 纯文本查看 复制代码 [TestMethod()]
public void GetHtmlDataAsyncTest()
{
MyTaskManager m_manager = new MyTaskManager();
m_manager.DoWork();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
Assert.Inconclusive("无法验证不返回值的方法。");
}
让单元测试线程沉睡,我们来观察Trace记录,这里的任务数我定的一百个,大家可以随意定。
QTAgent32.exe Information: 0 : in m_count 7
QTAgent32.exe Information: 0 : Out m_count-- 6
QTAgent32.exe Information: 0 :
3775878c-e2c9-420c-a6d6-0065575e5f23 2014/5/27 8:53:29 http://myhb.qq.com/f-1001229421-1.htm
8933b768-d894-422e-b14b-d1479a023e46 2014/5/27 8:53:38 http://myhb.qq.com/f-1001229421-1.htm
ff2994cd-d18b-435e-8612-2e94c1738377 2014/5/27 8:51:56 http://myhb.qq.com/f-1001229421-1.htm
a1facd72-ab1d-4fda-ab13-88629626896a 2014/5/27 8:53:16 http://myhb.qq.com/f-1001229421-1.htm
4309c8cf-7566-4f2a-80e6-d34d4166011e 2014/5/27 8:53:29 http://myhb.qq.com/f-1001229421-1.htm
e8d114f5-e91b-4721-bfe6-8a9102b86a0b 2014/5/27 8:52:34 http://myhb.qq.com/f-1001229421-1.htm
。。。。。。
好了,源码将在下一篇奉上,同时要提出一个难题了,继续埋个坑。
|