分布式单词发音抓取机器人
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的数量,如果统计的数量等于下载线程的数量,表示下载线程全部退出,同时文件已经回传完毕。这时,回传线程也可以退出了。
- ››分布式计算多机部署与配置
- ››分布式单词发音抓取机器人
- ››分布式网络爬虫关键技术分析与实现一网络爬虫相关...
- ››分布式 DBA: 创建和使用分区表
- ››分布式 Key-Value 存储系统:Cassandra 入门
- ››分布式 DBA: Cursor Stability Isolation Level 的...
- ››分布式 DBA:存储、I/O 和 DB2,第 1 部分(针对在...
- ››分布式管理:用 HADR 减少停机时间(详细解释如何...
- ››分布式 DBA:使用物化查询表
- ››分布式存储系统的实现
- ››分布式 DB2 UDB 服务器对比
- ››分布式DBA:掌握SQL存储过程
更多精彩
赞助商链接