Я разрабатываю код Python для Windows. Критерием является то, что он будет использовать менее 1% процессора. Я понимаю, что это невозможно гарантировать все время из-за таких вещей, как сбор мусора, но как лучше всего было бы как можно ближе подойти. Мое текущее решение состоит в том, чтобы распространять много time.sleep(0.1)
вокруг кода, особенно в циклах. Тем не менее, есть очевидные проблемы с этим подходом.
Какие другие подходы можно было бы предпринять?
Следует также упомянуть, что приложение имеет много потоков в нем, используя библиотеку threading
.
EDIT: Настройка приоритета процесса - это не то, что мне нужно.
Если целью является не беспокоить пользователя, тогда "ниже 1% CPU" является неправильным подходом. То, что вы действительно хотите, - "не убирайте время от других процессов, но все равно выполняйте как можно быстрее" - это то, что для "приоритета" ниже. См. Http://code.activestate.com/recipes/496767-set-process-priority-in-windows/ для примера того, как приоритет процесса может быть изменен для текущего процесса (вызов этой функции с параметрами по умолчанию будет выполняться).
Для рекламного ролика вы можете показать диспетчер задач, пока компьютер не работает ("См. 99%, мое приложение получает много работы"), а затем запустите приложение с интенсивным использованием процессора ("Почти все время процессора расходуется в приложении пользователь работает, мое приложение просто зашло в фон ").
Задача операционной системы - запланировать время процессора. Используйте встроенные механизмы ограничений операционной системы (надеюсь, они существуют в Windows), чтобы ограничить ваш процесс до <1% CPU.
Этот стиль разбрызгивания лишних спит каждые несколько строк в коде сделает код страшным создавать, расширять и поддерживать, не говоря уже о невероятно неэлегантном. (Ограничение скорости самостоятельно может быть полезно в очень маленьких, ограниченных критических разделах - например, ваша программа ставит в очередь множество запросов ввода-вывода, и вы не хотите наводнять операционную систему, возможно, вы захотите установить один сон до - [условие] в каждом критическом цикле, который может наводнить систему, но в противном случае использовать чрезвычайно экономно.)
В идеале вы должны вызывать API для соответствующих механизмов ОС из вашей программы при запуске, сообщая ОС, чтобы соответствующим образом дросселировать вас.
Если ящик, используемый для демонстрации, является Windows Server, он может использовать диспетчер системных ресурсов Windows для ограничения использования ЦП ниже желаемого порога. Попытка заставить это поведение по коду невозможно, если только Windows API не предоставляет эту возможность явно.