2016-05-24 6 views
0

私は、プロデューサ - コンシューマモデルでイメージダウンローダを実装しています。 1つのスレッドは(URL、ファイル名)のペアを生成してキューに入れます。 MAX_THREADSスレッドがペアを選択してダウンロードを開始します。ここに私のスレッドです:なぜこのスレッドは決して宣言されたり開始されたりしないのですか?

class Extractor(Thread): 
    def __init__(self, group=None, target=None, name=None, 
       args=(), kwargs=None, verbose=None, items=None): 
     super(Extractor, self).__init__() 
     self.target = target 
     self.name = name 
     self.items = items 

    def run(self): 
     while True: 
      for item in self.items: 
       if not QUEUE.full(): 
        QUEUE.put_nowait(extract(item)) 
        logging.debug('Putting ' + str(item) + ' : ' + str(QUEUE.qsize()) + ' items in queue') 

class Downloader(Thread): 
    def __init__(self, group=None, target=None, name=None, 
       args=(), kwargs=None, verbose=None): 
     super(Downloader, self).__init__() 
     self.target = target 
     self.name = name 
     self.seen = set() 

    def run(self): 
     while True: 
      if not QUEUE.empty(): 
       pair = QUEUE.get_nowait() 
       # I have seen the URL 
       if pair[0] in self.seen: 
        continue 
       else: 
        # Never seen it before 
        self.seen.add(pair[0]) 
        logging.debug('Downloading ' + str(pair[1]) + ' : ' + str(QUEUE.qsize()) + ' items in queue') 
        download_one_pic(pair) 


if __name__ == '__main__': 
    items = None 
    items = crawl('username__', items) 
    worker_threads = [] 

    producer = Extractor(name='Extractor', items=items) 
    producer.daemon = True 
    producer.start() 

    consumer = Downloader(name='Downloader[1]') 
    consumer2 = Downloader(name='Downloader[2]') 
    worker_threads.append(consumer) 
    worker_threads.append(consumer2) 

    for thread in worker_threads: 
     thread.start() 
     thread.join() 

キューは、50の最大の大きさを持っていると私はそれを悪魔持っているので、プロデューサースレッドは関係なく、他のスレッドの実行したいです。 1つは奇妙です。consumer2スレッドは決して始まりませんし、私には理由が分かりません。私のログにあるように、Downloader[1]とジョブとキューは49と50の間で変動し続けますので、Downloader[2]は決して開始されませんでした。

答えて

0

スレッドでjoin()を呼び出すと、スレッドが完了するまで待機してから返されます。ダウンローダのクラスが永遠にループするので、コードの最後のループは一度だけ実行されます。 1つのループで呼び出しを開始し、それらをループしてjoin()に戻し、すべてのスレッドが開始された後に待機します。

+0

これは私の問題を解決します:) – YaphatS

関連する問題