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

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

 2012-05-24 09:22:06 来源:WEB开发网   
核心提示:说明:下载线程在构造函数中就获得了任务列表队列和已下载文件队列,其处理过程前面已经叙述过了,分布式单词发音抓取机器人(4),首先从当前任务队列中取出一个单词,如果单词为’0’,表示已经没有任务了,同时文件已经回传完毕,这时,这时线程退出,否则

说明:下载线程在构造函数中就获得了任务列表队列和已下载文件队列,其处理过程前面已经叙述过了。首先从当前任务队列中取出一个单词,如果单词为’0’,表示已经没有任务了,这时线程退出。否则,就需要去构建单词页面的URL,然后分析页面的HTML代码,使用正则表达式找到单词音频文件的URL,接着将数据读入内存并写入磁盘。另外注意的是,下载线程在退出的时候会给已下载单词队列中写入’0’,以通知回传线程退出。
下载线程的执行逻辑对应的流程图如图7所示:

李超

图7 下载线程
文件回传线程

class FileTransferThread(threading.Thread): 
    global fileQueueMutex 
 
    def __init__(self,fileQueue): 
        threading.Thread.__init__(self) 
        self.fileQueue = fileQueue; 
        self.fileSocket = socket(AF_INET,SOCK_STREAM) 
        self.fileSocket.connect(('localhost',fileSocketPort)) 
        self.exitCounter = 0 
 
    def run(self): 
        while True: 
            fileQueueMutex.acquire() 
            while(len(self.fileQueue)==0): 
                fileQueueMutex.release() 
                time.sleep(fileWorkerSleep) 
                fileQueueMutex.acquire() 
            word = self.fileQueue.pop(0) 
            fileQueueMutex.release() 
            if(word == '0'): 
                self.exitCounter = self.exitCounter + 1 
                if (self.exitCounter == downloadWokerNum): 
                    self.fileSocket.send(word.encode('ascii')) 
                    self.fileSocket.close() 
                    break 
                else: 
                    continue 
            self.fileSocket.send(word.encode('ascii')) 
            response = self.fileSocket.recv(helloLength) 
            responseStr = response.decode('ascii') 
            if(responseStr != 'OK'): 
                self.fileSocket.close() 
                continue 
            saveName = word + '.mp3' + '.local' 
            infd = open(saveName,'rb') 
            data = infd.read(dataBlockSize) 
            while True:              
                self.fileSocket.send(data) 
                query = self.fileSocket.recv(maxWordLength) 
                answer = '' 
                data = infd.read(dataBlockSize)              
                if not data: 
                    answer = 'no' 
                    self.fileSocket.send(answer.encode('ascii')) 
                    break 
                else: 
                    answer = 'yes' 
                    self.fileSocket.send(answer.encode('ascii')) 
            infd.close() 

说明:回传线程在构造函数中获得了已下载的单词的队列。在运行的过程中,首先判断当前的已下载单词队列中是否有文件名,如果有则立即回传数据。下载线程在退出的时候会给已下载单词队列中写入’0’,以通知回传线程退出。回传线程会统计获得的0的数量,如果统计的数量等于下载线程的数量,表示下载线程全部退出,同时文件已经回传完毕。这时,回传线程也可以退出了。

上一页  1 2 3 4 5  下一页

Tags:分布式 单词 发音

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