我有一些代码,希望可以归结为正确的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')
此代码将无法完成...
引用文档,
Queue.join()
阻塞,直到队列中的所有项目都已获得并处理。
您已将100个项目放入队列中。该线程拉出4个项目,并完成。仍然有96个未处理的物品,没有人要拉它们。因此,queue.join()
从不返回。