2013-01-24 35 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個被處理。

相關問題