#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())
- при значении интервала, большем 0,
p.cpu_percent()
всегда будет отображаться 0.0, потому что это заблокирует ваш текущий процесс. В течение периода блокировки процент процессора фактически равен 0.0; - если значение интервала равно 0.0 или None, вызов другого
p.cpu_percent()
сразу послеp.cpu_percent()
этого также вернет 0.0. Период между этими двумя вызовами слишком короткий дляpsutil
правильного мониторинга. Поэтому убедитесь, что между двумя вызовами прошло не менее 0,1 секунды.
- при значении интервала, большем 0,
- Контролируйте какой-либо другой процесс, т.е.,
p = psutil.Process(other_pid)
- значение интервала, большее 0, вероятно, даст вам ожидаемое значение;
- значение интервала равно 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. Но мне нужно найти процент процессора объекта процесса