python多線程多隊列

n342 9年前發布 | 4K 次閱讀 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!