gpt4 book ai didi

python - 来自带有队列的生产者消费者中另一个类的线程

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:09 25 4
gpt4 key购买 nike

我想为消费者生产者实现一个实现。我还没有实现消费者,因为我的生产者有问题。目的是从互联网上下载一些文件。线程在自定义对象的方法内启动。线程是 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 部分,而不是将其放在“ma​​in”中:代码部分

最佳答案

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

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

因此程序被阻止。只需删除连接,因为看起来您的意思是让这些线程在程序的生命周期内持续存在。

关于python - 来自带有队列的生产者消费者中另一个类的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38432277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com