1

私はスレッド化の使用方法を理解しようとしていますが、http://www.ibm.com/developerworks/aix/library/au-threadingpython/でこの素晴らしい例を見つけました。

      #!/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 ステートメントがないため、ループはどのように終了しますか?

4

2 に答える 2

2

スレッドに複数のジョブを実行させたいですか? そうでない場合は、ループは必要ありません。もしそうなら、それを可能にする何かが必要です。ループは一般的なソリューションです。サンプル データには 5 つのジョブが含まれており、プログラムは 5 つのスレッドを開始します。したがって、ここで複数のジョブを実行するためにスレッドは必要ありません。ただし、ワークロードに URL をもう 1 つ追加してみて、何が変わるかを確認してください。

于 2013-01-24T04:22:33.837 に答える
2

ループがないと、最初のタスクが完了するとすぐに各ワーカー スレッドが終了するため、ループが必要です。あなたが望むのは、ワーカーが終了したときに別のタスクを実行することです。

上記のコードでは、作業中の 5 つの URL をカバーするのにたまたま十分な 5 つのワーカー スレッドを作成します。5 つ以上の URL がある場合、最初の 5 つだけが処理されたことがわかります。

于 2013-01-24T04:23:21.810 に答える