python多線程多隊列
程序大概內容如下:
程序中設置兩個隊列分別為queue負責存放網址,out_queue負責存放網頁的源代碼。
ThreadUrl線程負責將隊列queue中網址的源代碼urlopen,存放到out_queue隊列中。
DatamineThread線程負責使用BeautifulSoup模塊從out_queue網頁的源代碼中提取出想要的內容并輸出。
這只是一個基本的框架,可以根據需求繼續擴展。
import Queue
import threading
import urllib2
import time
from BeautifulSoup import BeautifulSoup
hosts = ["http://yahoo.com","http://taobao.com","http://apple.com",
"http://ibm.com","http://www.amazon.cn"]
queue = Queue.Queue()#存放網址的隊列
out_queue = Queue.Queue()#存放網址頁面的隊列
class ThreadUrl(threading.Thread):
def __init__(self,queue,out_queue):
threading.Thread.__init__(self)
self.queue = queue
self.out_queue = out_queue
def run(self):
while True:
host = self.queue.get()
url = urllib2.urlopen(host)
chunk = url.read()
self.out_queue.put(chunk)#將hosts中的頁面傳給out_queue
self.queue.task_done()#傳入一個相當于完成一個任務
class DatamineThread(threading.Thread):
def __init__(self,out_queue):
threading.Thread.__init__(self)
self.out_queue = out_queue
def run(self):
while True:
chunk = self.out_queue.get()
soup = BeautifulSoup(chunk)#從源代碼中搜索title標簽的內容
print soup.findAll(['title'])
self.out_queue.task_done()
start = time.time()
def main():
for i in range(5):
t = ThreadUrl(queue,out_queue)#線程任務就是將網址的源代碼存放到out_queue隊列中
t.setDaemon(True)#設置為守護線程
t.start()
#將網址都存放到queue隊列中
for host in hosts:
queue.put(host)
for i in range(5):
dt = DatamineThread(out_queue)#線程任務就是從源代碼中解析出<title>標簽內的內容
dt.setDaemon(True)
dt.start()
queue.join()#線程依次執行,主線程最后執行
out_queue.join()
main()
print "Total time :%s"%(time.time()-start)
本文由用戶 n342 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!