Остановка потока python, пока очередь не пуста - PullRequest
0 голосов
/ 16 июня 2020

У меня есть код, который я, надеюсь, свел к правильному MWE. Моя цель - остановить (несколько) потоков, если список в потоке имеет длину c. В отличие от 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')

Этот код не попадет в конец sh ...

1 Ответ

0 голосов
/ 17 июня 2020

Чтобы процитировать документацию,

Queue.join ()

Блокирует до тех пор, пока все элементы в очереди не будут получены и обработаны.

Вы поместили в очередь 100 предметов. Нить натягивает 4 элемента и завершается. Осталось 96 необработанных предметов, и тащить их никто не собирается. Следовательно, queue.join() никогда не возвращается.

...