Для остановки потоков при получении данных, отличных от None хотя бы из одного потока, можно использовать механизм событий (event) или семафоров.
Механизм событий позволяет потоку ждать наступления события и продолжать выполнение только после того, как событие произошло. В Python для работы с событиями используется класс threading.Event()
. Каждый поток будет проверять значение события и останавливаться при его наступлении.
Приведу пример кода, демонстрирующий, как остановить потоки при получении данных отличных от None хотя бы из одного потока с использованием механизма событий:
import threading # Создаем событие event = threading.Event() # Функция потока def thread_function(): while not event.is_set(): # Получаем данные data = get_data_from_source() # Здесь нужно использовать свою функцию получения данных if data is not None: event.set() # Устанавливаем событие, если получили данные отличные от None break # Создаем и запускаем потоки threads = [] for _ in range(num_threads): # Здесь num_threads - количество потоков, которые нужно запустить thread = threading.Thread(target=thread_function) thread.start() threads.append(thread) # Ожидаем наступления события event.wait() # Останавливаем все потоки for thread in threads: thread.join() # Продолжаем выполнение после остановки потоков print("Потоки остановлены")
В данном примере создается событие event
, которое изначально не установлено. Каждый поток выполняет функцию thread_function()
, которая в цикле проверяет значение события и получает данные. Если данные отличны от None, событие устанавливается и цикл прерывается с помощью break
. После наступления события event.wait()
блокирует выполнение программы до тех пор, пока событие не будет установлено. Затем все потоки останавливаются с помощью thread.join()
, и выполнение продолжается после этого блока.
Как только хотя бы из одного потока будет получено значение отличное от None, остальные потоки будут остановлены и программа продолжит работу.