分布式单词发音抓取机器人
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存储过程
更多精彩
赞助商链接
