我正在使用生产者-消费者模型实现图像下载器。 一个线程负责生成(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,并且我希望无论其他线程如何都可以运行Producer线程,因此我将其妖魔化 一件奇怪的事是, consumer2线程永远都不会启动,我也不知道为什么。 就像在我的日志中一样,只有Downloader[1]可以完成工作,并且队列一直在49到50之间波动,所以我知道Downloader[2]从未启动。

===============>>#1 票数:0 已采纳

在线程上调用join()会等到它完成后再返回。 在代码末尾的循环只会执行一次,因为Downloader类会永远循环。 在一个循环中调用start,然后再次将其循环到join(),并在所有线程启动后在此处等待

  ask by YaphatS translate from so

未解决问题?本站智能推荐: