cpu_percent(интервал = Нет) всегда возвращает 0 независимо от значения интервала PYTHON

#python #psutil

#питон #psutil

Вопрос:

Код всегда возвращает значения 0.0, независимо от значений интервала.

 import psutil
p = psutil.Process()
print p.cpu_percent(interval=1)
print p.cpu_percent(interval=None)
 

Комментарии:

1. Хм, я могу это воспроизвести. Это может быть ошибкой в более новых версиях psutil . (Я использовал другие версии библиотеки, и она всегда работала нормально). Обратите внимание, что я мог бы получить ненулевые значения, запуская разные потоки в текущем процессе.

2. Вы пробовали это с psutil.cpu_percent(interval=1) подобным, задокументированным на code.google.com/p/psutil/wiki/Documentation#CPU ? И я думаю, что при использовании класса Process вы должны указать PID (например p = psutil.Process(os.getpid()) ).

3. @ChristianBerendt: Я прочитал документацию по той же ссылке и указал несколько идентификаторов PID (действительных и работающих), но я всегда получал 0.0

4. >>> импортировать psutil>>> p = psutil. Process() >>> p.cpu_percent(интервал = 1) 0.0 >>> p.cpu_percent(интервал = Нет) 0.0 >>>

Ответ №1:

Это поведение задокументировано:

Когда интервал равен 0.0 или None сравнивает время процесса со временем системного процессора, прошедшим с момента последнего вызова, немедленно возвращается. Это означает, что при первом вызове он вернет бессмысленное 0.0 значение, которое вы должны игнорировать. В этом случае для точности рекомендуется, чтобы эта функция вызывалась во второй раз с интервалом не менее 0.1 нескольких секунд.

Существует также предупреждение против использования interval=None для одного вызова:

Предупреждение: при первом вызове этой функции с интервалом = 0.0 или None она вернет бессмысленное 0.0 значение, которое вы должны игнорировать.

При использовании interval=None обязательно выполните вызов .cpu_percent по сравнению с предыдущим вызовом.

 p = psutil.Process(pid=pid)
p.cpu_percent(interval=None)
for i in range(100):
    usage = p.cpu_percent(interval=None)
    # do other things
 

вместо того , чтобы:

 for i in range(100):
    p = psutil.Process(pid=pid)
    p.cpu_percent(interval=None)
    # do other things
 

Комментарии:

1. он по-прежнему возвращает 0.0

Ответ №2:

Процессор объекта процесса является изменяемым. Я провел для вас несколько тестов.

 for i in range(10):
    p = psutil.Process(3301)
    print p.cpu_percent(interval=0.1)
 

Результат:

9.9 0.0 0.0 0.0 0.0 9.9 0.0 9.9 0.0 0.0

Поэтому, если вы хотите получить процент процессора от объекта процесса, вы можете взять среднее значение за определенное время.

 test_list = []
for i in range(10):
    p = psutil.Process(6601)
    p_cpu = p.cpu_percent(interval=0.1)
    test_list.append(p_cpu)
print float(sum(test_list))/len(test_list)
 

Результат:

1.98

Больше информации на картинке

Ответ №3:

  • Отслеживайте текущий процесс, т. е. p = psutil.Process() Или p = psutil.Process(os.getpid())
    1. при значении интервала, большем 0, p.cpu_percent() всегда будет отображаться 0.0, потому что это заблокирует ваш текущий процесс. В течение периода блокировки процент процессора фактически равен 0.0;
    2. если значение интервала равно 0.0 или None, вызов другого p.cpu_percent() сразу после p.cpu_percent() этого также вернет 0.0. Период между этими двумя вызовами слишком короткий для psutil правильного мониторинга. Поэтому убедитесь, что между двумя вызовами прошло не менее 0,1 секунды.
  • Контролируйте какой-либо другой процесс, т.е., p = psutil.Process(other_pid)
    1. значение интервала, большее 0, вероятно, даст вам ожидаемое значение;
    2. значение интервала равно 0.0 или None, вам все равно не следует вызывать cpu_percent() функцию слишком быстро после другой, причина та же, что и выше.

Еще одна записка:

p = psutil.Process() должен вызываться только один раз и повторно p использоваться впоследствии, а не вызывать его каждый раз перед вызовом p.cpu_percent() ; в противном случае вы фактически вызываете cpu_percent() функцию в первый раз при каждом вызове p.cpu_percent() с неожиданным возвращаемым значением 0.0.

Ответ №4:

Из моего собственного кода, который работает:

 cpu = psutil.cpu_times_percent(interval=0.4, percpu=False)
 

Комментарии:

1. Но мне нужно найти процент процессора объекта процесса