python 多執行緒多佇列
阿新 • • 發佈:2018-11-09
我們常常目標具有多工,所以我們才多佇列,但是為了提高速度,常常採用多執行緒,所以多執行緒多佇列
#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)