2013-01-24 25 views
1
一个队列时

我想了解如何使用线程和我在http://www.ibm.com/developerworks/aix/library/au-threadingpython/为什么使用线程和Python中

 #!/usr/bin/env python 
     import Queue 
     import threading 
     import urllib2 
     import time 

     hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com", 
     "http://ibm.com", "http://apple.com"] 

     queue = Queue.Queue() 

     class ThreadUrl(threading.Thread): 
     """Threaded Url Grab""" 
     def __init__(self, queue): 
      threading.Thread.__init__(self) 
      self.queue = queue 

     def run(self): 
      while True: 
      #grabs host from queue 
      host = self.queue.get() 

      #grabs urls of hosts and prints first 1024 bytes of page 
      url = urllib2.urlopen(host) 
      print url.read(1024) 

      #signals to queue job is done 
      self.queue.task_done() 

     start = time.time() 
     def main(): 

     #spawn a pool of threads, and pass them queue instance 
     for i in range(5): 
      t = ThreadUrl(queue) 
      t.setDaemon(True) 
      t.start() 

     #populate queue with data 
      for host in hosts: 
      queue.put(host) 

     #wait on the queue until everything has been processed  
     queue.join() 

     main() 
     print "Elapsed Time: %s" % (time.time() - start) 

我不明白的部分是跨越这个很好的例子就需要无限循环为什么run方法有一个无限循环:

 def run(self): 
      while True: 
      ... etc ... 

只是为了笑我跑的程序,而不循环,它看起来运行良好! 那么有人可以解释为什么需要这个循环? 循环如何退出,因为没有break语句?

+0

直到线程停止,循环才会退出。 – Ryan

+0

谁说这是*需要*?不是。不过,这正是这个程序需要的。我怀疑你的问题是:为什么这个程序不能在无限循环中卡住? –

+0

我不认为没有某种循环,程序“运行良好”,因为它只能处理主机URL之一。 – martineau

回答

2

你想要线程执行多个工作吗?如果不是,你不需要循环。如果是这样,你需要一些能够做到的事情。循环是一个常见的解决方案。您的示例数据包含五个作业,并且该程序启动五个线程。所以你不要需要任何线程在这里做多个工作。不过,尝试为工作负载添加一个URL,然后查看有哪些更改。

1

循环是必需的,因为没有它,每个工作线程在完成第一个任务后立即终止。你想要的是当工作完成时让工作人员完成另一项任务。

在上面的代码中,您创建了5个工作线程,这恰好足以覆盖您正在使用的5个URL。如果你的网址超过5个,你会发现只有前5个被处理。