コンシューマプロデューサの実装用に実装したいと思います。私はプロデューサーに問題があるので、まだ消費者を実装していません。目的は、インターネットにいくつかのファイルをダウンロードすることです。スレッドは、カスタムオブジェクトのメソッド内で開始されます。スレッドはスレッディングをサブクラス化するオブジェクトです。ここでは、通常、それらのすべての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部分を扱う消費者スレッドを持つことがポイントです。コード
ありがとうございました。スレッドを終了させる作業は、queue.join()とqueue.task_done()を使ってキューによって処理されますか? – Apostolos
いいえ、スレッドは、現在の実装でプログラムの存続期間中に決して終了しません。それらはデーモンスレッドであるため、Pythonプログラムを終了することができます。 'queue'がなくなると、' page = self.queue.get() 'でブロックされます。あなたは 'queue.task_done()'でそれを正しく行い、 'queue.join()'を実行することができます。これは、キューのすべての項目が取得されて処理されるのを待つことです。 –
ダウンロードが現在の実装で返されるときにスレッドを終了する方法はありますか?私は正しいとは思わない?それらを強制的に停止させる方法はありますか?スレッドを強制的に停止させるのがベストプラクティスではないと聞きましたか? – Apostolos