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)

猜你喜欢

转载自blog.csdn.net/DAo_1990/article/details/68495207