为什么这个线程永远不会被声明或启动?
Why does this thread never gets declared or started?
我正在使用生产者-消费者模型实现图像下载器。一个线程负责生成 (url, filename) 对并将它们放入队列中。我希望 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()
queue 的最大大小为 50,我希望 Producer 线程到 运行 而不管其他线程,所以我让它 妖魔化 。一件奇怪的事是 consumer2 线程永远不会启动,我不知道为什么。在我的日志中,只有 Downloader[1]
完成了这项工作,并且队列在 49 到 50 之间不断波动,所以我知道 Downloader[2]
永远不会启动。
在线程上调用 join() 会等到它在它之前完成 returns。代码末尾的循环只会执行一次,因为 Downloader 类 会永远循环。在一个循环中调用 start 然后再次循环到 join() 并在所有线程启动后在那里等待
我正在使用生产者-消费者模型实现图像下载器。一个线程负责生成 (url, filename) 对并将它们放入队列中。我希望 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()
queue 的最大大小为 50,我希望 Producer 线程到 运行 而不管其他线程,所以我让它 妖魔化 。一件奇怪的事是 consumer2 线程永远不会启动,我不知道为什么。在我的日志中,只有 Downloader[1]
完成了这项工作,并且队列在 49 到 50 之间不断波动,所以我知道 Downloader[2]
永远不会启动。
在线程上调用 join() 会等到它在它之前完成 returns。代码末尾的循环只会执行一次,因为 Downloader 类 会永远循环。在一个循环中调用 start 然后再次循环到 join() 并在所有线程启动后在那里等待