转自:《计算机工程》 文/ 董瑞洪,张秋余,唐静兵,张涛
线程
线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。单个进程可能包含几个线程,它们可以同时执行进程的地址空间中的代码。每个线程有自己的一组cpu寄存器和堆。线程可以看成“一段代码的执行”也就是一系列有jvm执行的二进制指令。这里面没有对象甚至没有方法的概念。线程是有序的指令,而不是方法。
线程的数据结构,仅仅只包括执行这些指令的信息。它包含当前的运行上下文,如寄存器的内容,当前指令的在运行引擎的指令流中的位置,保存方法本地参数和变量的运行时堆栈。切换线程更有效率,时间单位是us。对于java而言,一个线程可以看作是jvm的一个状态。
创建线程
java使用两种方法来处理多线程。
1.子类化Thread对象。Thread对象是java提供的封装线程的对象。要创建一个线程,必须创建一个从Thread对象类导出的新类。必须覆盖 Thread的run()函数来完成有用的工作。如果使用的类需要子类化另一个类,就不能子类化Thread对象。
2.实现Runnable接口。Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,还必须创建Thread类的实例,这一点通过Thread类的构造函数 public Thread(Runnable target)来实现。
线程间通信
当线程在继续执行当前需要等待一个条件时,仅有synchronized关键字是不够的。虽然synchronized关键字阻止并非更新一个对象,但它并没实现线程间通信。Object类为此提供了3个函数:wait(),notify()和notifyAll()。以全球气候预测程序为例。这些程序通过将地球分为许多单元,在每个循环中,每个单元的计算都是隔离进行的,知道这些值趋于稳定,然后相邻单元之间就会交换一些数据。所以,从本质上讲,在每个循环中各个线程都必须等待所有线程完成各自的任务以后才能进入下一个循环。模型称为屏蔽同步。
spider程序的结构
构造spider程序有两种方式:1.把能spider程序设计为递归的程序 2.编写一个非递归的程序,它要维护一个要访问的网页列表。考虑使用哪一种方式的前提是,构造的spider程序必须能访问非常大的web站点。
本系统中使用了非递归的程序设计方法。这是因为,当一个递归程序运行时要把每次递归压入堆栈,但在本系统设计中使用的是多线程,它允许一次运行多个任务,但是,多线程与递归是不兼容的。因为在这一过程中每个线程都有自己的堆栈,而当一个方法调用它自身时,他们需要使用同一个堆栈。这意味着递归的 spider程序不可能使用多线程。
数据库设计
在程序执行的过程中,考虑对储存网页的储存过程进行监控,以便决定spider程序对访问队列处理。因为,在数据库设计过程中,添加了网页储存状态这个字段。
在Internet中,有很大一部分网页数据大于8000byte,如果用普通的二进制型字段(binary,varbinary)是不能完成存储要求的。因而,设计数据库中储存网页数据的字段为BLOB字段,实际使用为text类型。这就要求对该字段的储存和读取过程中,不能按照常规的字段读取方式进行。
一个URL对应一个网页,选取网页数据对应的URL对位数据库中记录的主键,进行唯一标识。
类的设计
Getsite类,spider类,spiderInternalWolkload类,spiderWorker类,spiderDone 类,spiderSqlWorkload类,接口 spiderReportable, IWorkloadStorable
GetSite类为程序的入口,负责整个spider程序的运行。
当创建一个spider程序时,需要使用spider类。spider类服务于3个目的:
1.担当spider接口,为使用spider提供方法;
2.这个对象管理线程池,并将spider的发现向启动此spider的对象报告(即spider对象和spiderWorker对象间通信)
3.检测spider何时完成是spider的任务。spider类必须坚持spider何时完成。这一任务有spiderdone类来完成。
SpiderWorker对象的目的是处理URL。
由于有很多并发的线程,要确切地知道spider何时完成是相当困难的。这需要一个对象来精确地跟踪有多少个线程仍在运行,spiderDone类就是为完成这一任务来设计的。
抢先式多线程spider程序的实现
由于spider是多线程的,必须有一种方法在不同的线程间分配任务。这个工作死有spiderWorker对象来完成的。通过这个对象维护线程池,可以承担spider创建和销毁线程对象的任务。
我们的网络爬虫广泛使用了多线程,必须把任务分成很多小任务。spider的任务是下载一个web站点,并将网页内的链接加入到作业中来。 spiderWorker实现了这一个基本任务。当spider开始时,它创建一个处理spider发现网页的spiderWorker类池。
线程创建
用spider的start()函数,该函数再调用run()。SpiderWorker对象的生成在spider类中,如以下代码所示:
public Spider(ISpiderReportable manager,String URL,HTTP http,int poolSize,IWorkerloadStorable w) {
_manager = manager;
_workSpider = false;
_pool = new SpiderWorker[poolSize];
for( int i = 0; i< _pool.length;i++){
HTTP hc = http.copy();
_pool[i] = new SpiderWorker( this,hc);
}
}
其中,最后一行代码生成SpiderWorker对象。也就是说,在构造Spider对象的同时,生成了SpiderWorker对象进行线程的管理,并且生成了线程池。SpiderWorker对象的start()方法被调用后,开始执行SpiderWorker的run()方法,为进一步处理网页做好了准备。
线程调用
在已经初始化线程,发现待处理URL队列的基础上,SpiderWorker对象调用SpiderDone类的workerBegin()方法,唤醒已经初始化过的spider线程。
synchronize public void workBegin() {
_activeThreads ++;
_started = true;
notify();
}
线程的唤醒调用notify()方法。
线程关闭
紧接着调用SpiderWorker对象的processWorkload()方法,进入到网页处理的真正执行代码,转入到类GetSite中。 processWorkload方法执行完毕,也就是说,该线程完成了自己的历史使命,执行了网页处理的过程,就应该为其他的线程让出资源,因为就应关闭该线程。执行SpiderDone类的 workerEnd()方法,如以下代码所示:
synchronized public void workerEnd() {
_activeThreads -- ;
notify();
}
分享到:
相关推荐
### 抢先式多线程Spider在智能搜索引擎中的实现 #### 概述 随着互联网的飞速发展,网络上信息量呈爆炸性增长,如何高效地检索这些信息成为了一个重要的研究课题。智能搜索引擎技术应运而生,成为了计算机工业界和...
* 网络爬虫在搜索引擎中的作用是非常重要的,因为它们可以快速地爬取和处理大量的网络数据。 * 网络爬虫的设计要求包括高效的爬取策略、快速的数据处理和存储、可靠的网络连接等。 三、Java语言和JBuilder工具 * ...
### 基于多线程的网络爬虫设计与实现 #### 概述 网络爬虫作为一种高效的数据抓取工具,在大数据时代...通过本文的介绍,读者可以了解到基于多线程网络爬虫的设计思路和技术要点,为进一步的实际应用打下坚实的基础。
C#之HTTP协议多线程下载实现spider网络爬虫程序编写[借鉴].pdf
【Python Spider多线程爬虫】 在Python中,网络爬虫是用于自动化抓取互联网信息的程序。多线程爬虫是其中一种...在实际应用中,还需要考虑反爬策略、数据清洗、存储和分析等多个环节,以实现一个完整的网络爬虫系统。
【标题】"Spider_java.zip" 是一个包含Java实现的网络爬虫项目的压缩包,主要针对搜索引擎数据抓取。这个项目的核心在于使用Java编程语言来构建一个能够自动化浏览网页、解析HTML内容并收集所需信息的程序。网络爬虫...
标题中的“抢先式多线程网络蜘蛛”是一个网络爬虫程序,它采用了多线程技术来提高抓取网页的效率。在IT领域,网络爬虫是用于自动化地从互联网上搜集信息的一种软件工具,通常用于数据挖掘、搜索引擎索引或者网站性能...
标题中的“抢先式多线程网络蜘蛛”是一个网络爬虫程序,它采用了多线程技术来提高抓取网页数据的效率。在IT行业中,网络爬虫是用于自动抓取互联网信息的一种程序,常用于数据分析、搜索引擎索引更新等场景。这里的...
Win32 API 支持抢先式多线程网络,这是编写MFC网络蜘蛛非常有用的地方。SPIDER工程(程序)是一个如何用抢先式多线程技术实现在网上用网络蜘蛛/机器人聚集信息的程序。 <br>该工程产生一个象蜘蛛一样行动的程序...
综上所述,“网络爬虫之Spider”项目是一个使用Java语言实现的网络爬虫软件,通过多线程技术提高了爬取效率,可能利用了第三方库进行网络请求和HTML解析,并具备数据存储和异常处理功能。通过这个项目,开发者可以...
在多线程爬虫中,每个线程可以负责处理一个或多个URL。 6. **HTML解析**:为了提取有用信息,爬虫需要解析HTML文档。C语言中没有内置的HTML解析库,但可以使用第三方库如libxml2或自己实现简单的解析机制。 7. **...
### 简析搜索引擎中网络爬虫的搜索策略 #### 一、引言 随着互联网技术的迅猛发展,网络信息量急剧增加,人们获取信息的方式也在发生着根本性的转变。传统的方法已经无法满足用户对信息的需求,搜索引擎因此...
### 搜索引擎中网络爬虫技术的发展 #### 引言 随着互联网的迅猛发展,搜索引擎技术也随之快速进步,成为人们在网络海洋中获取信息的重要工具。搜索引擎的效能直接关系到用户能否快速准确地找到所需信息。其中,...
在多线程爬虫中,我们可以将待爬取的URL放入队列,由多个线程分别取出并处理,这样可以有效地管理和控制爬取的顺序和速度。 这个"python_web_crawler"项目可能包含以下组件: - **`spider.py`**:主要的爬虫脚本,...
3.整个spider的开发过程为增量式,从最开始的单页搜索url到最后的多线程spider,这在版本规划中又很明显的体现。每个版本都有自己的readme,其中详细叙述了各个版本的不同 4.由于是初学者,我在每个版本中都是边写边...
在"spider"这个项目中,你可以通过以上知识点,构建一个基本的C++网络爬虫,它将按照广度优先搜索的策略,从给定的起始URL开始,遍历并抓取相关的网页。在实际开发过程中,还需要根据具体需求进行扩展,如实现更复杂...
目前,专业搜索引擎网络爬虫通常采用“最好优先”原则访问WEB,即为快速、有效地获得更多的与主题相关的页面(简称“回报”),每次选择“最有价值”的链接进行访问。由于链接包含于页面之中,而通常具有较高价值...
网络爬虫,或称为“蜘蛛”(Spider),是互联网上的一种自动化程序,它的主要任务是遍历Web页面,抓取并存储网页内容,以便进行后续的数据分析或构建搜索引擎。在IT领域,网络爬虫是一种至关重要的工具,尤其对于...
搜索引擎是互联网上的一种重要工具,它的核心功能是通过爬虫(Spider)技术抓取网络上的信息,然后对抓取的数据进行处理和索引,以便用户能够快速、准确地找到所需内容。在这里,我们将深入探讨“搜索引擎,spider...