我曾经在.NET中写过一个Crawler。为了提高可伸缩性,我试图利用.NET的异步API。.NET没有可靠的异步套接字通信?
System.Net.HttpWebRequest具有异步API BeginGetResponse/EndGetResponse。但是,这对API只是获取HTTP响应头文件和Stream实例,我们可以从中提取HTTP响应内容。所以,我的策略是使用BeginGetResponse/EndGetResponse异步获取响应Stream,然后使用BeginRead/EndRead从响应Stream实例异步获取字节。
一切似乎都是完美的,直到履带车进行压力测试。在压力测试中,Crawler遭受高内存使用。我用WinDbg + SoS检查了内存,并发现大量的字节数组是由System.Threading.OverlappedData实例引起的。在互联网搜索后,我发现这个KB http://support.microsoft.com/kb/947862从微软。
根据知识库,异步I/O的数量应该有一个“上限”,但它不会告诉“建议”的限制值。所以,在我看来,这个KB无济于事。这显然是一个.NET错误。最后,我不得不放弃从响应Stream中进行异步提取字节的想法,只是以同步的方式进行。
在.NET库,允许 异步IO用点网插座 (Socket.BeginSend/ Socket.BeginReceive/ NetworkStream.BeginRead/ NetworkStream.BeginWrite)必须对量的 上限缓冲区 未完成(发送或接收) 与他们的异步IO。
网络应用应当具有 上限 优秀异步IO,它的帖子的数量。
编辑:添加一些问号。
任何人有任何经验在Socket & NetworkStream上做异步I/O? 一般来说,生产中的爬虫是否使用带有同步或异步的互联网进行I/O?
不是一个单独的问号,除了在主题...一个坏的标志。 – 2008-10-25 10:02:19