Professional+Parallel+Programming+with+C#打开这本书..看到代码如下..
{
class Program
{
static void Main(string[] args)
{
Parallel.Invoke(
() => ConvertEllipses(),
() => ConvertRectangles(),
() => ConvertLines(),
() => ConvertText());
System.Console.ReadLine();
}
static void ConvertEllipses()
{
System.Console.WriteLine(“Ellipses converted.”);
}
static void ConvertRectangles()
{
System.Console.WriteLine(“Rectangles converted.”);
}
static void ConvertLines()
{
System.Console.WriteLine(“Lines converted.”);
}
static void ConvertText()
{
System.Console.WriteLine(“Text converted.”);
}
}
}具体效率如何 你可以自己实验下...

解决方案 »

  1.   

    当需要很多工作线程的时候,一般会先初始化这些线程(也就是只new thread(委托),然后再遍历启动,而不是逐个进行
    如果用的托管线程池ThreadPool可以SetMinThreads
      

  2.   


     Parallel.ForEach(urls, url =>
                {
                    Console.WriteLine("耗费时间:" + sw.Elapsed + GetTitle(url));
                }
               );目前测试的结果,速度是最快的。
      

  3.   

    那您觉得用ThreadPool 然后设置足够的线程数(跟抓取Urls的任务数一样)性能高还是
    用Parallel 性能高? 或更合理呢,测试结果是Parallel比较高。但我不熟悉这个底层机制是怎么利用多线程和并行计算的。
      

  4.   

    高大上,解决不了。
    线程不行开进程,好像就是楼主说的开好几Console
      

  5.   

    网页抓取,与线程池的选择基本没有关系。
    不过从测试结果来看,SmartThreadPool并没有并发,个人感觉存在并发数量设置的问题。
    另外这种测试结果表现的仅仅是当时的网络状况,包括目标服务器端的。
    如果真的在意整体性能,就应该采取异步模式,另外网页抓取要注意超时控制。
      

  6.   

    SmartThreadPool smartThreadPool = new SmartThreadPool();
                IWorkItemResult wir = smartThreadPool.QueueWorkItem(() =>
                {
     
                    foreach (var url in urls)
                    {
                        Console.WriteLine("耗费时间:" + sw.Elapsed + GetTitle(url));
                        // System.Threading.Thread.Sleep(1000);
                    }
     
                });
                smartThreadPool.WaitForIdle();
    楼主你这样好像只是添加了一个任务线程吧?没用过这个,猜测
      

  7.   

    那您觉得用ThreadPool 然后设置足够的线程数(跟抓取Urls的任务数一样)性能高还是
    用Parallel 性能高? 或更合理呢,测试结果是Parallel比较高。但我不熟悉这个底层机制是怎么利用多线程和并行计算的。这是因为Parallel本身有一个根据CPU数量优化任务调度的算法
    而不是像new线程跑完就结束那么生硬,因为后者同样会有线程回收再创建的情况从而影响性能 
      

  8.   

    我在想遇到那种装有狗的或者防止ddos攻击服务器的软件的时候怎么办?
      

  9.   

    四五年前做过这种需求的项目,线程越多不一定效率越高,也就是说开多个application会比开更多的线程要好。还有个原因是因为肯定会碰到防火墙以及访问量大屏蔽的问题,当时我采用的是分布式的采集策略,还做了专门的爬虫管理分配任务的模块。
    另外要提醒的就是做这块数据库的设计也要必须要多考虑下的,再多说就等于告诉你实现方法了。
      

  10.   

    我已经写好了只是在比较性能而已。。目前是暂时用Parallel,性能还有待观察或许还不行的话,会考虑HttpWebRequest异步问题。。你说的分布式抓取,能详细说说嘛?如果分享任务和共同维护一个对象资源。
    比如A计算机 7点50分抓取 Url-A页面,B计算机7点50分抓取Url-B页面。当一台计算机出现故障的时候,如果去用其他计算机去补救另外一台计算机的未完成任务?
      

  11.   


    我已经写好了只是在比较性能而已。。目前是暂时用Parallel,性能还有待观察或许还不行的话,会考虑HttpWebRequest异步问题。。你说的分布式抓取,能详细说说嘛?如果分享任务和共同维护一个对象资源。
    比如A计算机 7点50分抓取 Url-A页面,B计算机7点50分抓取Url-B页面。当一台计算机出现故障的时候,如果去用其他计算机去补救另外一台计算机的未完成任务?数据量上亿,爬虫这块主要用内存数据库来保存爬虫每次抓取的结果是成功还是失败,每次抓取时优先从内存数据库中获取采集成功率较高的一些爬虫。分布式爬虫的部署可以有多种方法,可以用多点服务器也可以多用点代理服务器。
      

  12.   

    我已经写好了只是在比较性能而已。。目前是暂时用Parallel,性能还有待观察或许还不行的话,会考虑HttpWebRequest异步问题。。你说的分布式抓取,能详细说说嘛?如果分享任务和共同维护一个对象资源。
    比如A计算机 7点50分抓取 Url-A页面,B计算机7点50分抓取Url-B页面。当一台计算机出现故障的时候,如果去用其他计算机去补救另外一台计算机的未完成任务?数据量上亿,爬虫这块主要用内存数据库来保存爬虫每次抓取的结果是成功还是失败,每次抓取时优先从内存数据库中获取采集成功率较高的一些爬虫。分布式爬虫的部署可以有多种方法,可以用多点服务器也可以多用点代理服务器。
    你说的是Memcache这类吧?
      

  13.   

    我只说一下我在2005年时的一些经验,记得当时机器cpu单核赛杨1.7,内存忘记了,反正也不会过1,2G;根据当时测试是,50线程以内更好些,具体多少忘记了。现在楼主的机器在4核,几十线程更不在话下,但还得看你抓取的网页复杂程度啊?访问网站的打开速度啊?你要不要分析后才入库呢?等等原因。楼主的要求还是比较高的,5秒抓50页面,这取决于多种情况,只能一点点试哪一种方案更合适了,个人拙见。
      

  14.   

    楼主,请用 SignalR 非常好用。