Я написал бесконечный цикл в Python для печати Нет! на выходе.

while True:
    print("No!")

Когда я выполняю его, я вижу его процесс (pythonw.exe) в Windows-Task-Manager, который использует 60% ЦП. Я щелкнул правой кнопкой мыши по его процессу и изменил приоритет на Низкий. он снова использует 60% процессора! Затем я меняю приоритет на Real-Time. Это все еще использует 60% центрального процессора!

Обновление: мое общее использование процессора для всего процесса составляет 80% !!! и 20% бесплатно! Почему этот цикл Python не использует эти 20%?!

Что не так с приоритетом? Почему это не меняется?

2 ответа2

2

Приоритет определяет, какой поток будет запущен, когда несколько потоков конкурируют за процессорное время. Если процессору больше ничего не нужно, поток (ы) вашей программы получит до 100% процессорного времени, как и при необходимости, независимо от приоритета.

В вашем случае процесс Python - это единственный процесс, требующий много процессорного времени, поэтому он получит все, о чем просит. Если бы ваша система была иначе занята, то вы бы увидели, что ваши 60% упали намного больше, чем если бы они имели обычный приоритет.

Вы должны протестировать его с другой программой, потребляющей процессор, запущенной одновременно, например, в оболочке CMD, запустите test.cmd, содержащий:

:Loop
dir /s c:\
goto Loop

Тогда вы увидите последствия изменения приоритета вашего конкурирующего процесса. Обратите внимание, что требования к ЦП в этом примере будут различаться в зависимости от скорости ЦП, количества файлов в c:\ и размеров дискового кэша; перенаправление вывода dir на >nul: увеличит нагрузку на процессор.

0

Нет ничего плохого в приоритете.

Распространено предположение, что низкий или средний приоритет, установленный для процесса, приведет к тому, что операционная система ограничит время ЦП, доступное для потоков процесса, поэтому, установив более высокий приоритет, следует позволить использовать больше ЦП!

Но это не то, что происходит.

У процесса может быть установлен наименьший возможный приоритет, и если его коду никогда не нужно ничего ждать, и если больше ничего в системе не требует времени ЦП, этот процесс получит 100% ЦП.

Если процесс получает менее 100% ЦП и не пытается запустить ничего с равным или более высоким приоритетом, то это просто означает, что потоки процесса тратят часть своего времени, не желая использовать ЦП.

Что делает поток, если ему не нужен процессор? Большую часть времени это "ожидание". Потоки ждут, когда им нужно что-то, что не требует запуска собственного кода потока в ЦП. Обычно они ожидают завершения операции ввода-вывода. Это может быть запрос ввода-вывода, явно запрашиваемый потоком, или это может быть, например, ошибка жесткого листа. (С другой стороны, время, затраченное на "ожидание" задержки чтения или записи в ОЗУ, является частью процессорного времени потока. Это не считается вводом / выводом.)

Ваш цикл в Python включает функцию "печати". Это операция ввода-вывода, даже если она только на экране.

Вы можете использовать Windows Performance Analyzer, чтобы получить подробную информацию о том, что делает pythonw.exe, что заставляет его ждать.

Вы можете рассмотреть мой ответ здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .