liango Scala

The simple Scala build tool

详解Heritrix多线程结构

                               详解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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lord_is_layuping/article/details/6159123
个人分类: web spider
上一篇cmp指令:比较文件差异
下一篇Java网页抓取例子
想对作者说点什么? 我来说一句

Heritrix使用详解与高级开发应用

2011年04月29日 801KB 下载

没有更多推荐了,返回首页

关闭
关闭