在队列不为空时停止python线程

问题描述 投票:0回答:1

我有一些代码,希望可以归结为正确的MWE。我的目标是,如果线程中的列表具有特定长度,则停止(多个)线程。与MWE相比,尚不知道需要多少次迭代:

from queue import Queue
from threading import Thread

def is_even(n):
    return n % 2 == 0

class MT(Thread):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue
        self.output = []

    def run(self):
        while len(self.output) < 4:
            task = self.queue.get()
            if is_even(task):
                self.output.append(task)
                self.queue.task_done()
            else:
                self.queue.task_done()
        print(self.output)
        print('done')

queue = Queue(10)

threads = 1

thr = []

for th in range(threads):
    thr.append(MT(queue))

for th in thr:
    th.start()


for i in range(100):
    queue.put(i)


queue.join()


for th in thr:
    th.join()

print('finished')

此代码将无法完成...

python multithreading python-multithreading
1个回答
0
投票

引用文档,

Queue.join()

阻塞,直到队列中的所有项目都已获得并处理。

您已将100个项目放入队列中。该线程拉出4个项目,并完成。仍然有96个未处理的物品,没有人要拉它们。因此,queue.join()从不返回。

© www.soinside.com 2019 - 2024. All rights reserved.