max_workers=8 ограничивает число потоков выполнения. Но это не мешает отдельному циклу отправки создавать Future для каждой конечной точки в огромном входном наборе.

Python 3.14 добавляет ограниченную опцию предварительного чтения:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=8) as executor:
    for result in executor.map(check_proxy, endpoints, buffersize=24):
        record_result(result)

check_proxy — это существующая синхронная проверка с сетевыми сроками и очисткой; record_result обрабатывает возвращённое ею наблюдение. Значения 8 и 24 — примерные бюджеты. бесплатный список прокси предоставляет публичные кандидаты для конечных точек; сохраняйте их протокол вместе с адресом, чтобы check_proxy мог использовать правильный транспорт.

Когда буфер отправки заполняется, map приостанавливает потребление итерируемого объекта, пока результаты не будут выданы. Это касается и генераторов.

map по-прежнему выдаёт результаты в порядке входа: медленная ранняя проверка может удерживать готовые последующие результаты и задерживать дальнейший вход. Для обработки в порядке завершения используйте явно ограниченный набор futures, пополняемый по мере завершения.

Обрабатывайте ожидаемые сетевые сбои внутри проверки, если пакет должен продолжать выдавать результаты. Необработанное исключение возникает при извлечении этого элемента. chunksize в ThreadPoolExecutor не даёт такого бюджета отправки, а в более ранних версиях Python нет buffersize.

Похожие статьи