import threading
import Queue
import urllib2
import time
class ThreadURL(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
host = self.queue.get()
sock = urllib2.urlopen(host)
data = sock.read()
self.queue.task_done()
hosts = ['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com', 'http://stackoverflow.com']
start = time.time()
def main():
queue = Queue.Queue()
for i in range(len(hosts)):
t = ThreadURL(queue)
t.start()
for host in hosts:
queue.put(host)
queue.join()
if __name__ == '__main__':
main()
print 'Elapsed time: {0}'.format(time.time() - start)
我一直在努力理解如何执行线程,经过几个教程后,我想出了上面的方法。
它应该做的是:
- 初始化队列
- 创建我的线程池,然后排队列出主机列表
- 一旦队列中有主机并读取网站数据,我的ThreadURL类就会开始工作
- 程序应该完成
首先,我想知道的是,我是否做得正确?这是处理线程的最佳方式吗?
其次,我的程序无法退出。它会打印出“已用时间”行,然后挂起。我必须杀死终端才能让它消失。我认为这是由于我不正确地使用了“queue.join()”引起的?