Python: результаты печати concurrent.futures.as_completed только после завершения всех процессов

1) Я пытаюсь выполнить 8 параллельных процессов, используя concurrentFutures. Код работает, как и ожидалось. Но результаты печатаются только после завершения всех процессов. Я хочу, чтобы результаты были напечатаны, как только они будут доступны (а не после завершения всех процессов). Как я могу это сделать?

2) Функция «do_it» ничего не печатает в среде IDLE, в окне IDLE печатаются только команды печати в функции main(). Но команды печати в «do_it» печатаются в окне онлайн-компилятора Python (https://www.programiz.com/python-programming/online-compiler/). Зачем?

Я использую python3.9.5 в ОС Windows.

import concurrent.futures
import time

def do_it(x):
    print(f'sleeping for {x}')
    start = time.perf_counter()
    time.sleep(x)
    end = time.perf_counter()
    tTaken = round(end - start, 2)
    return ['done sleeping', tTaken]

def main():
    start = time.perf_counter()

    with concurrent.futures.ProcessPoolExecutor() as executor:
        delays = [1,2,3,4,5,6,7,8]
        results = [executor.submit(do_it, x) for x in delays]

    for f in concurrent.futures.as_completed(results):
        [txt, duration] = f.result()
        print(f'{txt} : time taken {duration}')

    end = time.perf_counter()
    tTaken = round(end - start, 2)
    print(f'total time  taken : {tTaken}')
        
    
if __name__ == '__main__':
    main()

 
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы только начинаете as_completedпосле исполнитель закончил.

Вместо этого попробуйте запустить, пока исполнитель все еще существует:

def main():
    start = time.perf_counter()

    print("Submitting jobs")
    with concurrent.futures.ProcessPoolExecutor() as executor:
        delays = [1, 2, 3, 4, 5, 6, 7, 8]
        results = [executor.submit(do_it, x) for x in delays]

        print("Running as_completed", flush=True)
        for f in concurrent.futures.as_completed(results):
            [txt, duration] = f.result()
            print(f"{txt} : time taken {duration}", flush=True)

    end = time.perf_counter()
    tTaken = round(end - start, 2)
    print(f"total time  taken : {tTaken}")

Это должно привести к чему-то вроде:

Submitting jobs
sleeping for 1
sleeping for 2
sleeping for 3
Running as_completed
sleeping for 4
sleeping for 5
done sleeping : time taken 1.04
sleeping for 6
done sleeping : time taken 2.03
sleeping for 7
done sleeping : time taken 3.0
sleeping for 8
done sleeping : time taken 4.01
done sleeping : time taken 5.05
done sleeping : time taken 6.07
done sleeping : time taken 7.01
done sleeping : time taken 8.03
total time  taken : 12.08

Редактировать

Что касается отсутствия вывода дочерних процессов, это связано с тем, как Python должен запускать новые процессы в ms-windows. В отличие от систем UNIX/POSIX, дескрипторы файлов нет наследуются дочерними процессами. Таким образом, вы не увидите print вывод дочернего процесса в ms-windows. Предположительно, онлайн-питон работает в системе UNIX/POSIX.

Спасибо. Вы знаете ответ на второй вопрос?

Aadityaraj 20.03.2022 14:01

Другие вопросы по теме