WEB开发网
开发学院服务器负载均衡 分布式单词发音抓取机器人 阅读

分布式单词发音抓取机器人

 2012-05-24 09:22:06 来源:WEB开发网   
核心提示:网络编程实验课程要求必须写一个套接字的应用程序,考虑到之前写过的单词发音抓取程序的效率比较低下,分布式单词发音抓取机器人,就顺便结合套接字做一个分布式的抓取软件,其中涉及到动态任务领取,其中启动accept方法,收到任务请求线程的请求之后,负载均衡,多线程

网络编程实验课程要求必须写一个套接字的应用程序,考虑到之前写过的单词发音抓取程序的效率比较低下,就顺便结合套接字做一个分布式的抓取软件。其中涉及到动态任务领取,负载均衡,多线程,加锁解锁,简单的HTML代码解析,文件读写等功能。程序还是使用Python完成,对于学习Python、套接字编程、分布式编程甚至集群编程都有一定的意义。
另外,此软件具有一定的攻击性,如果启动的从节点数量过多,并且每个节点上启动的线程数量过大,那么提供单词发音的服务器可能承受不住压力。所以,此软件对于编写web服务器的负载压力测试有一定的参考意义。
下面是系统结构图:

Chaos Lee

图1 系统结构图


图1为系统结构图,整个系统由主节点和从节点两大部分构成,主节点上有四种不同类型的线程,分别为:
l 任务侦听线程:负责接受从节点上的任务请求线程,需要注意的是,任务侦听线程并不负责和请求线程通信,而是启动一个新的单词分发线程负责和请求线程通信。
l 单词分发线程池:为从节点上的请求线程服务的主节点上的线程的集合。
l 文件侦听线程:负责接受从节点上的数据回传请求,需要注意的是,文件侦听线程并不负责和请求线程通信,而是启动一个新的写磁盘线程和请求线程通信。
l 写磁盘线程:为从节点上的请求线程服务的主节点上的线程的集合。
客户端也是使用并发的方式实现,一共有以下三类线程:
l 请求线程:当单词队列小于一定的阈值时,请求线程负责向主节点的任务侦听线程请求任务。
l 下载线程池,负责现在单词音频文件的线程的集合
l 文件回传线程:负责将写入本地磁盘上的文件回传到主节点上的线程
另外,系统中还有几个关键的数据结构:
l 主节点上的全部单词列表,其中存储了所有的需要下载发音文件对应的单词,该数据结构是一个队列。
l 从节点上的部分单词列表,其中存储了从节点上需要下载的部分单词,该数据结构是一个队列。
l 从节点上的已下载的mp3文件名称列表,其中存储了已经下载的mp3文件的路径,该数据结构为一个队列。
下面为具体的编码实现,仅为核心代码没有贴所有代码。如果有需要可以给我发邮件索取~
任务侦听线程

class WordDispatchThread(threading.Thread): 
 
    def __init__(self,wordsList): 
        threading.Thread.__init__(self) 
        self.wordSocket = socket(AF_INET,SOCK_STREAM) 
        self.wordSocket.bind(('',wordSocketPort)) 
        self.wordSocket.listen(maxConnectNum) 
        self.wordsList = wordsList 
     
    def run(self): 
        while True: 
            clientSock,address = self.wordSocket.accept() 
            print 'connect from %s is established.' % str(address) 
            wordWorker = WordServiceThread(clientSock,self.wordsList) 
            wordWorker.start() 

说明:在该类的构造函数中,将创建侦听套接字,并将全部单词列表作为类的参数成员。线程运行为一个死循环,其中启动accept方法,收到任务请求线程的请求之后,将启动任务分发线程为其服务。
该线程的状态转换图如图2所示:

李超

1 2 3 4 5  下一页

Tags:分布式 单词 发音

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接