【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

详解Heritrix多线程结构

原创 2011年01月22日 21:48:00

                               详解Heritrix多线程结构


想要更快速地抓取网页的内容,则必须采用多线程 抓取。

1.Heritrix中实现了一个标准的线程池ToePool,用于管理所有的抓取线程ToeThread.


2.ToePool和ToeThread都位于org.archive.crawler.framework包中.



3.ToePool的初始化实在CrawlController的initialize()方法中完成的.

       
        代码如下
            CrawlController的initialize ()方法
            {
                ...
               
                toePool = new ToePool(this);
                // 按order.xml中的配置,实例化并启动线程
                toePool.setSize(order.getMaxToes());
                ...
            }
           
4.ToePool的构造函数

        代码如下:
        public ToePool (CrawController c)
        {
            // 调用父类java.lang.ThreadGroup的构造函数
            super("ToeThreads");
            // 将注入的c付给类变量this.controller
            this.controller = c;
        }
5. ToePool的setSize方法
   
        流程图如下
       
        代码如下:
        // TODO:
       
6.总结:根据上面的代码,可以得出结论:线程池在创建的时候,并没有任何活动的线程实例;当线程池的setSize()方法被调用时,才创建新线程.

 

7.startNewThread方法
    代码如下:
    privatesynchronizedvoidstartNewThread(){
        ToeThread newThread = new ToeThread(this,nextSerialNumber++);
        // 设置线程优先级
        newThread.setPriority(DEFAULT_TOE_PRIORITY);
        // 起势:启动线程
        newThread.start();
    }
   
8.当启动ToeThread后(即newThread.start();),执行的是其run()方法中的代码.

9. run方法
 代码如下:
133     public void run() {
134         String name = controller.getOrder().getCrawlOrderName();
135         logger.fine(getName()+" started for order '"+name+"'");
136
137         try {
138             while ( true ) {
139                 // TODO check for thread-abort? or is waiting for interrupt enough?
140                 continueCheck();
141                
142                 setStep(STEP_ABOUT_TO_GET_URI);
143                
144                 CrawlURI curi = controller.getFrontier().next();
145                 // 如封似闭:同步当前线程
146                 synchronized(this) {
147                     continueCheck();
148                     setCurrentCuri(curi);
149                 }
150                 // 处理取出的链接
151                 processCrawlUri();
152                
153                 setStep(STEP_ABOUT_TO_RETURN_URI);
154                 continueCheck();
155                // 揽雀尾:如将分析得到的新的链接加入到等待队列中
156                 synchronized(this) {
157                     controller.getFrontier().finished(currentCuri);
158                     setCurrentCuri(null);
159                 }
160                
161                 setStep(STEP_FINISHING_PROCESS);
162                 lastFinishTime = System.currentTimeMillis();
                      // 放虎归山:释放链接
163                 controller.releaseContinuePermission();
164                 if(shouldRetire) {
165                     break; // from while(true)
166                 }
167             }
168         } catch (EndedException e) {
169             // crawl ended (or thread was retired), so allow thread to end
170         } catch (Exception e) {
171             // everything else (including interruption)
172             logger.log(Level.SEVERE,"Fatal exception in "+getName(),e);
173         } catch (OutOfMemoryError err) {
174             seriousError(err);
175         } finally {
176             controller.releaseContinuePermission();
177         }
178         setCurrentCuri(null);
179         // 收 势:Do cleanup so that objects can be GC.
180         this.httpRecorder.closeRecorders();
181         this.httpRecorder = null;
182         localProcessors = null;
183
184         logger.fine(getName()+" finished for order '"+name+"'");
185         setStep(STEP_FINISHED);
186         controller.toeEnded();
187         controller = null;
188     }

 

--------------------------------------------------------------------------------
reference 更多:

 

    CrawlController源码
    http://crawler.archive.org/xref/org/archive/crawler/framework/CrawlController.html

 

    ToeThread源码
    http://crawler.archive.org/xref/org/archive/crawler/framework/ToeThread.html

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

网址收集(知识库)

       `we知识大纲: interview   everyday 1、方便快捷的查找过往知识! 2、实时更新,并积累分类,并总结入博客 3、两部分内部:A、对于知识的经验自总结                          B、参考网址的记

网络爬虫讲解(附java实现的实例)

luojinping的专栏 目录视图摘要视图订阅 CSDN日报20170219——《程序员的沟通之痛》      【技术直播...

开发自己的搜索引擎--Lucene 2.0+Heriterx(目录)

第一篇  搜索引擎入门第1章  搜索引擎与信息检索    11.1  搜索引擎的历史    11.1.1  萌芽:Archie、Gopher    11.1.2  起步:Robot(网络机器人)的出现...

开源爬虫Labin,Nutch,Neritrix介绍和对比

Larbin开发语言:C++http:

开源爬虫Labin,Nutch,Neritrix介绍和对比

从网上找了一些开源spider的相关资料,整理在下面:   ----------------------------------------------------------------...

heritrix多线程抓取--好使

最近作业中有个需要用Heritrix抓包的任务,不过抓起来,我真的崩溃了。用我的电脑抓了奖金20个小时,抓了50M。都哭了。不过发现那个active threads项最多只有一个,很多时候都是0。偶表示压力很大。。 怎么搞的?? 听朋友说,加上网上搜资料,终于搞定,原来Heritrix采用HostnameQueueAssignmentPolicy来进行对URL处理。url队列以hostname为key,所有相同key的url放置在同一个队列里面,也就是说同一个host下面的所有url都放在一个队列里面,当线程获取url时候,会将该队列放置到同步池中,拒绝其他线程访问。觉得说的有道理,嘿嘿。按

开源爬虫Labin,Nutch,Neritrix介绍和对比

从网上找了一些开源spider的相关资料,整理在下面:   ----------------------------------------------------------------------...

开发自己的搜索引擎

<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1203788093687&lmt=1203788092&format=336x280_as&output=html&correlator=1203788093625&url=file%3A%2

开源爬虫Labin,Nutch,Neritrix介绍和对比

----------------------------------------------------------------------------------- ************** ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)