1. 程式人生 > >python 多執行緒多佇列

python 多執行緒多佇列

我們常常目標具有多工,所以我們才多佇列,但是為了提高速度,常常採用多執行緒,所以多執行緒多佇列

#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)