Как я могу снизить использование процессора для этой программы Python?

15

Я буду запускать Python 24/7 в цикле while, вот пример такой программы:

while True:

    print ("me again...")

Но когда я запускаю его, мой процессор уходит на 100%! Но я не хочу этого, так как моя программа будет работать в течение долгого времени и т. Д., И я не хочу, чтобы мой процессор сильно нагревался, есть ли способ предотвратить это?

user151324
источник
3
без ожидания процессор уходит на 100%, потому что это то, что вы сказали ему делать :) печатайте так быстро, как только можете. Так что ожидание поможет разгрузить это бремя. печать, как правило, очень дорогая операция. запись в файл намного дешевле.
Петр Кула
Вы должны сообщить операционной системе, что вы не хотите никаких циклов ЦП в течение определенного периода времени, иначе вы не сможете ничего сделать, чтобы избежать того, что вы видите.
Турбьерн Равн Андерсен

Ответы:

16

В конце вашего цикла есть

time.sleep(xx)за секунды, или time.sleep(x.x)для представления частичных секунд

(Пожалуйста , не забудьте импортировать библиотеку времени, например , так: import time)

С хх, как можно выше, без ущерба для вашей программы. Прямо сейчас ваша программа всегда делает все как можно быстрее, вместо того, чтобы дать Пи время отдохнуть или сделать что-то еще.

Баттерс
источник
Хм ... Очень интересно ... Я попробую. Благодарность! Не могу поверить, я не думал об этом!
user151324
Есть ли библиотека, которую я должен импортировать и т. Д.? Я получаю сообщение о том, что время не определено
user151324
@coding_corgi да, вам нужна библиотека времени.
Баттерс
2
Так что import time?
user151324
@coding_corgi. Да, это правильно.
Баттерс
14

Предисловие

Убедитесь, что вам действительно нужно многократно запускать свою задачу. Это называется занятым ожиданием и почти всегда неоптимальным. Если ваша задача проверяет вывод подпроцесса, например, вы можете просто subprocess.wait()завершить его. Если ваша задача состоит в том, чтобы дождаться прикосновения к файлу или каталогу в файловой системе, вы можете использовать pyinotify для запуска вашего кода из события файловой системы, обработанного ядром.

Ответ

Вот как вы пишете бесконечный цикл для занятого ожидания, не потребляя слишком много ресурсов процессора.

Python 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Python 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

оценка

Как проверял @gnibbler в другом ответе , представленный код не должен занимать более 1% процессорного времени на последних компьютерах. Если он по-прежнему потребляет слишком много ресурсов ЦП с вашим кодом полезной нагрузки, подумайте об увеличении времени ожидания еще больше. С другой стороны, может потребоваться оптимизировать код полезной нагрузки для повторного выполнения. Например, кэширование может ускорить работу с неизмененными данными.

кредиты

Этот ответ пытается основываться на ответе @ user2301728 .

Бенгт
источник
3

У меня была такая же проблема, см. Мой вопрос на Stack Exchange . Решение было сочетание time.sleep(0.01)и nice. niceснижает процессор, доступный для приложения. Это, как я запустить приложение: nice -n 19.

dotancohen
источник
1

Вы также можете попробовать nice -n 19 python myscript.py.

nice - это утилита * nix для установки приоритета ЦП задачи. 19 - самый большой вес и, следовательно, самый медленный параметр.

CyberSkull
источник
2
Нет. Повышение привлекательности процесса помогает, только позволяя другим процессам чаще получать ЦП. В любой момент, когда нет других процессов, код OP по-прежнему будет использовать 100% ЦП, и если они есть, они будут использовать ЦП, что в сумме снова составит 100%.
Бенгт