我们常常目标具有多任务,所以我们才多队列,但是为了提高速度,常常采用多线程,所以多线程多队列
#coding=utf-8
import Queue
import threading
import urllib2
import time
from BeautifulSoup import BeautifulSoup
hosts = ["http://yahoo.com", "http://taobao.com", "https://baidu.com",]
queue = Queue.Queue() # 存放网址的队列
out_queue = Queue.Queue() # 存放网址页面的队列
class MyThread(threading.Thread):
def __init__(self, func):
threading.Thread.__init__(self)
self.func = func
def run(self):
self.func()
def do_work():
while True:#不要使用 while not out_queue.empty():
host=queue.get()
url = urllib2.urlopen(host)
chunk = url.read()
out_queue.put(chunk) # 将hosts中的页面传给out_queue
queue.task_done() # 传入一个相当于完成一个任务
def do_work2():
while True: #不要使用 while not out_queue.empty():
chunk =out_queue.get()
soup = BeautifulSoup(chunk) # 从源代码中搜索title标签的内容
print soup.findAll(['title'])
out_queue.task_done()
start = time.time()
def main():
for i in range(5):
t = MyThread(do_work) # 线程任务就是将网址的源代码存放到out_queue队列中
t.setDaemon(True) # 设置为守护线程
t.start()
print "out_queue: %d"%out_queue.qsize()
# 将网址都存放到queue队列中
for host in hosts:
queue.put(host)
print "queue: %d" % queue.qsize()
for i in range(5):
dt = MyThread(do_work2) # 线程任务就是从源代码中解析出<title>标签内的内容
dt.setDaemon(True)
dt.start()
queue.join() # 线程依次执行,主线程最后执行
out_queue.join()
main()
print "Total time :%s" % (time.time() - start)