2016-07-18 4 views
1

コンシューマプロデューサの実装用に実装したいと思います。私はプロデューサーに問題があるので、まだ消費者を実装していません。目的は、インターネットにいくつかのファイルをダウンロードすることです。スレッドは、カスタムオブジェクトのメソッド内で開始されます。スレッドはスレッディングをサブクラス化するオブジェクトです。ここでは、通常、それらのすべての5つは、彼らはrunメソッドであるものを行うプロデューサの別のクラスのスレッドキューを持つコンシューマ

from Queue import Queue 

from downloader_thread import Downloader 


class Main(object): 
    def __init__(self): 
     self.queue = Queue(0) 
     self.out_queue = Queue(0) 
     self.threads = [] 
     self.max_threads = 5 

    def download(self): 
     page = 1 
     for i in range(self.max_threads): 
      download_thread = Downloader(self.queue, self.out_queue) 
      download_thread.setDaemon(True) 
      download_thread.start() 
      self.threads.append(download_thread) 

     while page < 100: 
      self.queue.put(page) 
      page += 1 

     self.queue.join() 

     for thread in self.threads: 
      thread.join() 


if __name__ == "__main__": 

    main = Main() 
    main.download() 
    while not main.out_queue.empty(): 
     print main.out_queue.get() 

問題は、スレッドが開始されていることであるコード

downloader_thread.py

from threading import Thread 

import time 


class Downloader(Thread): 
    def __init__(self, queue, out_queue): 
     super(Downloader, self).__init__() 
     self.queue = queue 
     self.out_queue = out_queue 

    def run(self): 
     while True: 
      page = self.queue.get() 
      if page: 
       print "Simulating download" 
       print "Downloading page ", page 
       time.sleep(3) 
       self.out_queue.put(page) 

      self.queue.task_done() 

main_class.pyあり、しかし、停止しないので、whileは決して実行されません。私はちょっとスレッドと並行プログラミングのために少し新しくなっています。だから穏やかにしてください:) メイン "の中にこれを置くのではなく、コードのwhile部分を扱う消費者スレッドを持つことがポイントです。コード

答えて

1

無限ループのあるrun()メソッドがあるため、スレッドは終了しません。あなたのdownload()方法あなたのスレッドにjoin()で:

 for thread in self.threads: 
      thread.join() 

ので、プログラムがブロックされています。プログラムの存続期間中にそれらのスレッドが永続することを意味しているように、結合を削除するだけです。

+0

ありがとうございました。スレッドを終了させる作業は、queue.join()とqueue.task_done()を使ってキューによって処理されますか? – Apostolos

+0

いいえ、スレッドは、現在の実装でプログラムの存続期間中に決して終了しません。それらはデーモンスレッドであるため、Pythonプログラムを終了することができます。 'queue'がなくなると、' page = self.queue.get() 'でブロックされます。あなたは 'queue.task_done()'でそれを正しく行い、 'queue.join()'を実行することができます。これは、キューのすべての項目が取得されて処理されるのを待つことです。 –

+0

ダウンロードが現在の実装で返されるときにスレッドを終了する方法はありますか?私は正しいとは思わない?それらを強制的に停止させる方法はありますか?スレッドを強制的に停止させるのがベストプラクティスではないと聞きましたか? – Apostolos

関連する問題