需要一些Python线程/队列的帮助

dav*_*ave 6 python queue multithreading asynchronous

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)
Run Code Online (Sandbox Code Playgroud)

我一直试图了解如何执行线程,经过一些教程后,我想出了上述内容.

它应该做的是:

  1. 初始化队列
  2. 创建我的线程池,然后排队主机列表
  3. 然后,一旦主机进入队列并读取网站数据,我的ThreadURL类就应该开始工作了
  4. 该计划应该完成

首先我想知道的是,我这样做是否正确?这是处理线程的最佳方法吗?

其次,我的程序未能退出.它打印Elapsed time出线然后挂在那里.我必须杀死我的终端才能离开.我假设这是由于我的错误使用queue.join()

Yan*_*min 7

你的代码看起来很好,非常干净.

您的应用程序仍然"挂起"的原因是工作线程仍在运行,等待主应用程序将某些内容放入队列中,即使您的主线程已完成.

解决此问题的最简单方法是t.daemon = True在调用start之前将线程标记为守护进程.这样,线程不会阻止程序停止.