多线程实际运用<第七篇>

1、单线程采集100个页面

    class Program
    {
        static int i = 6991275;
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            getTitle();
            sw.Stop();
            Console.WriteLine("采集100个页面完成,用时:" + sw.ElapsedMilliseconds + "毫秒");

            Console.ReadKey();
        }

        static void getTitle()
        {
            for (int j = 0; j < 100; j++)
            {
                WebClient wc = new WebClient();
                wc.BaseAddress = "http://www.juedui100.com/";
                wc.Encoding = Encoding.UTF8;
                string html = wc.DownloadString("user/" + ++i + ".html");
                Regex reg = new Regex(@"<title>(.*)</title>");
                Console.WriteLine(reg.Match(html));
            }
        }
    }

  输出:

  

2、多线程采集100个页面

    class Program
    {
        static int i = 6991275;
        static volatile int k = 1;
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(getTitle);
            }
            while (true)
            {
                if (k == 5)
                {
                    sw.Stop();
                    break;
                }
            }
            Console.WriteLine("采集100个页面完成,用时:" + sw.ElapsedMilliseconds + "毫秒");
            Console.ReadKey();
        }

        static void getTitle(object o)
        {
            while(i < 6991375)
            {
                WebClient wc = new WebClient();
                wc.BaseAddress = "http://www.juedui100.com/";
                wc.Encoding = Encoding.UTF8;
                string html = wc.DownloadString("user/" + Interlocked.Increment(ref i) + ".html");
                Regex reg = new Regex(@"<title>(.*)</title>");
                Console.WriteLine(reg.Match(html));
            }
            k++;
        }
    }

  输出如下:

  

  单纯从执行时间来看,采集100个页面,用5个线程效率提升2倍多,当然这跟带宽也有关系啦。

  有问题,好像K++多个线程执行的时候有问题,也要Interlocked.Increment。以后再改、

时间: 2024-10-08 04:16:46

多线程实际运用<第七篇>的相关文章

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

SaltStack 入门到精通 - 第七篇: Targeting

什么是Targeting? Targeting minions 是指那些minion会作为运行命令或是执行状态的目标.这些目标可以是一个主机名,系统信息,定义的分组,甚至是自定义的绑定的对象. 例如命令  salt web1 apache.signal restart 可以重启ID 为web1的minion的apache.当然也可以在top文件中使用web1来作为目标匹配的内容: base:   'web1':     - webserver Targing 有哪些匹配方式? Minion Id

用仿ActionScript的语法来编写html5——第七篇,自定义按钮

第七篇,自定义按钮 这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ backLayer = new LSprite(); addChild(backLayer); btn01 = new LButton(new LBitmap(new LBitmapData(imglist["replay_button_up"])),new LBitmap(new L

第七篇 Integration Services:中级工作流管理

本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcurrentExecutables属性.这一篇我们将检查.演示并测试优先约束赋值为"成功"."完成"."失败"时对工作流的影响.约束赋值如果你按照前一篇的步骤操作过,打开My_First_SSIS_Project解决方案下的Precedence.dtsx

第七篇:创建一个SOUI的Hello World

从0开始一个SOUI项目 1.环境配置 SOUI项目本质是一个基于Win32窗口的应用程序.因此首先我们可以从Win32窗口应用程序向导创建一个简单的Win32项目. 并在第3页选择“Window应用程序” 选择“完成”后生成一个Win32应用程序骨架. 项目的文件结构如下图: 要使用SOUI开发程序程序,首先当然是要找到从SVN获取的SOUI项目代码.假定SOUI项目保存在%SOUIPATH%这个环境变量指向的目录(安装了SOUI向导后会自动创建这个环境变量). 我们需要在VS的include

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo

第七篇 Replication:合并复制-订阅

本篇文章是SQL Server Replication系列的第七篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅.这一篇假设你遵循了前面六篇,并且你已经配置好合并发布.配置订阅为了能创建订阅,你必须使用一个(能够访问订阅服务器和发布服务器的)登录名连接到数据库.另外,这个登录名至少需要是订阅数据库和发布数据库的db_owner角色的成员.连接到发布服务器首先你需要在对象资源管理器下连接到订阅服务器.打开复制文件

SQL Server索引 - 非聚集索引 &lt;第七篇&gt;

一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向新的数据页面,而不是更新所有相关非聚集索引的行定位器.这样,虽然降低了非聚集索引的维护开销,但是增加了从非聚集索引行到数据行的导航开销,因为添加了一个旧数据页面和信数据页面之间的连接.因此,将聚集索引作为行定位器降低了非聚集索引相关的开销. 二.定义书签查找 当一个查询请求不是优化器选择的非聚集索引

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================