具有队列的Producer使用者中的另一个类的线程

时间:2016-07-18 08:47:27

标签: python multithreading queue producer-consumer

我想为Consumer Producer实现一个实现。我还没有实现消费者,因为我对制作人有问题。目的是在互联网上下载一些文件。线程在自定义对象的方法内启动。线程是子类化threading.Thread的对象。这是代码

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

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()

问题是线程正常启动所有五个,它们执行run方法中的内容,但不停止,所以while永远不会被执行。我是线程和并发编程的新手,所以请温柔:)

重点是让一个消费者线程处理代码的while部分,而不是在&#34; main &#34;:代码的一部分

1 个答案:

答案 0 :(得分:1)

您的线程永远不会终止,因为它们具有带有无限循环的run()方法。在download()方法中,join()指向这些主题:

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

因此该程序被阻止。只需删除连接,因为您似乎意味着这些线程在程序的生命周期中仍然存在。