cpu-percent в psutil возвращает 0.0 для каждого процесса

Я был вдохновлен, чтобы попытаться создать генератор обоев wordcloud с помощью аналогичного проекта github. Я не очень опытен, и это похоже на хороший проект для начинающих.

На данный момент я пытаюсь получить полезный вывод из psutil, и, похоже, он работает, но что-то не так.

import wordcloud # For wordcloud generation
import psutil # for the linux process data and cpu usage

#Creates a list to store the output of procInfo
theOneProcessList = list()

# Lists every process and it's cpu usage and appends it to theOneProcessList
for proc in psutil.process_iter(attrs=None, ad_value=None):
    procInfo = proc.as_dict(attrs=['name', 'cpu_percent'])
    theOneProcessList.append(procInfo)
print(theOneProcessList)

На выходе получается массив, в котором перечислены все процессы в Linux и их соответствующее использование процессора. Что-то вроде этого:

[{'name': 'systemd', 'cpu_percent': 0.0}, {'name': 'kthreadd', 'cpu_percent': 0.0}, {'name': 'rcu_gp', 'cpu_percent': 0.0}, {'name': 'rcu_par_gp', 'cpu_percent': 0.0}, {'name': 'kworker/0:0H-kblockd', 'cpu_percent': 0.0}, {'name': 'mm_percpu_wq', 'cpu_percent': 0.0}, {'name': 'ksoftirqd/0', 'cpu_percent': 0.0}, {'name': 'rcu_preempt', 'cpu_percent': 0.0}, {'name': 'rcu_sched', 'cpu_percent': 0.0}, {'name': 'rcu_bh', 'cpu_percent': 0.0}, {'name': 'rcuc/0', 'cpu_percent': 0.0}, {'name': 'rcub/0', 'cpu_percent': 0.0}, {'name': 'migration/0', 'cpu_percent': 0.0}, {'name': 'idle_inject/0', 'cpu_percent': 0.0}, {'name': 'cpuhp/0', 'cpu_percent': 0.0}, {'name': 'cpuhp/1', 'cpu_percent': 0.0}, {'name': 'idle_inject/1', 'cpu_percent': 0.0}, {'name': 'migration/1', 'cpu_percent': 0.0}, {'name': 'rcuc/1', 'cpu_percent': 0.0}, {'name': 'ksoftirqd/1', 'cpu_percent': 0.0}, {'name': 'kworker/1:0H-kblockd', 'cpu_percent': 0.0}, {'name': 'cpuhp/2', 'cpu_percent': 0.0}, {'name': 'idle_inject/2', 'cpu_percent': 0.0}, {'name': 'migration/2', 'cpu_percent': 0.0}, {'name': 'rcuc/2', 'cpu_percent': 0.0}, {'name': 'ksoftirqd/2', 'cpu_percent': 0.0}, {'name': 'kworker/2:0H-kblockd', 'cpu_percent': 0.0}, {'name': 'cpuhp/3', 'cpu_percent': 0.0}, {'name': 'idle_inject/3', 'cpu_percent': 0.0}, {'name': 'migration/3', 'cpu_percent': 0.0}, {'name': 'rcuc/3', 'cpu_percent': 0.0}, {'name': 'ksoftirqd/3', 'cpu_percent': 0.0}, {'name': 'kworker/3:0H-kblockd', 'cpu_percent': 0.0}, {'name': 'kdevtmpfs', 'cpu_percent': 0.0}, {'name': 'netns', 'cpu_percent': 0.0}, {'name': 'rcu_tasks_kthre', 'cpu_percent': 0.0}, {'name': 'kauditd', 'cpu_percent': 0.0}, {'name': 'kworker/2:1-mm_percpu_wq', 'cpu_percent': 0.0}, {'name': 'kworker/3:1-events', 'cpu_percent': 0.0}, {'name': 'khungtaskd', 'cpu_percent': 0.0}, {'name': 'oom_reaper', 'cpu_percent': 0.0}, {'name': 'writeback', 'cpu_percent': 0.0}, {'name': 'kcompactd0', 'cpu_percent': 0.0}, {'name': 'ksmd', 'cpu_percent': 0.0}, {'name': 'khugepaged', 'cpu_percent': 0.0}, {'name': 'crypto', 'cpu_percent': 0.0}, {'name': 'kintegrityd', 'cpu_percent': 0.0}, {'name': 'kblockd', 'cpu_percent': 0.0}, {'name': 'edac-poller', 'cpu_percent': 0.0}, {'name': 'devfreq_wq', 'cpu_percent': 0.0}, {'name': 'watchdogd', 'cpu_percent': 0.0}, {'name': 'kswapd0', 'cpu_percent': 0.0}, {'name': 'kthrotld', 'cpu_percent': 0.0}, {'name': 'irq/42-pciehp', 'cpu_percent': 0.0}, {'name': 'acpi_thermal_pm', 'cpu_percent': 0.0}, {'name': 'nvme-wq', 'cpu_percent': 0.0}, {'name': 'nvme-reset-wq', 'cpu_percent': 0.0}, {'name': 'nvme-delete-wq', 'cpu_percent': 0.0}, {'name': 'ipv6_addrconf', 'cpu_percent': 0.0}, {'name': 'kstrp', 'cpu_percent': 0.0}, {'name': 'charger_manager', 'cpu_percent': 0.0}, {'name': 'ata_sff', 'cpu_percent': 0.0}, {'name': 'scsi_eh_0', 'cpu_percent': 0.0}, {'name': 'scsi_tmf_0', 'cpu_percent': 0.0}, {'name': 'scsi_eh_1', 'cpu_percent': 0.0}, {'name': 'scsi_tmf_1', 'cpu_percent': 0.0}, {'name': 'kworker/1:1H-kblockd', 'cpu_percent': 0.0}, {'name': 'kworker/0:1H-kblockd', 'cpu_percent': 0.0}, {'name': 'kworker/2:1H-kblockd', 'cpu_percent': 0.0}, {'name': 'kworker/u9:0-hci0', 'cpu_percent': 0.0}, {'name': 'jbd2/sda6-8', 'cpu_percent': 0.0}, {'name': 'ext4-rsv-conver', 'cpu_percent': 0.0}, {'name': 'kworker/3:1H-kblockd', 'cpu_percent': 0.0}, {'name': 'systemd-journald', 'cpu_percent': 0.0}, {'name': 'lvmetad', 'cpu_percent': 0.0}, {'name': 'iprt-VBoxWQueue', 'cpu_percent': 0.0}, {'name': 'iprt-VBoxTscThr', 'cpu_percent': 0.0}, {'name': 'systemd-udevd', 'cpu_percent': 0.0}, {'name': 'irq/49-mei_me', 'cpu_percent': 0.0}, {'name': 'cfg80211', 'cpu_percent': 0.0}, {'name': 'kmemstick', 'cpu_percent': 0.0}, {'name': 'rtsx_usb_ms_1', 'cpu_percent': 0.0}, {'name': 'i915/signal:0', 'cpu_percent': 0.0}, {'name': 'i915/signal:1', 'cpu_percent': 0.0}, {'name': 'i915/signal:2', 'cpu_percent': 0.0}, {'name': 'i915/signal:6', 'cpu_percent': 0.0}, {'name': 'kworker/u9:1-hci0', 'cpu_percent': 0.0}, {'name': 'nv_queue', 'cpu_percent': 0.0}, {'name': 'nv_queue', 'cpu_percent': 0.0}, {'name': 'nvidia-modeset/', 'cpu_percent': 0.0}, {'name': 'nvidia-modeset/', 'cpu_percent': 0.0}, {'name': 'irq/53-nvidia', 'cpu_percent': 0.0}, {'name': 'nvidia', 'cpu_percent': 0.0}, {'name': 'nv_queue', 'cpu_percent': 0.0}, {'name': 'systemd-timesyncd', 'cpu_percent': 0.0}, {'name': 'bluetoothd', 'cpu_percent': 0.0}, {'name': 'dbus-daemon', 'cpu_percent': 0.0}, {'name': 'systemd-logind', 'cpu_percent': 0.0}, {'name': 'avahi-daemon', 'cpu_percent': 0.0}, {'name': 'crond', 'cpu_percent': 0.0}, {'name': 'ModemManager', 'cpu_percent': 0.0}, {'name': 'NetworkManager', 'cpu_percent': 0.0}, {'name': 'avahi-daemon', 'cpu_percent': 0.0}, {'name': 'sddm', 'cpu_percent': 0.0}, {'name': 'polkitd', 'cpu_percent': 0.0}, {'name': 'Xorg', 'cpu_percent': 0.0}, {'name': 'wpa_supplicant', 'cpu_percent': 0.0}, {'name': 'udisksd', 'cpu_percent': 0.0}, {'name': 'upowerd', 'cpu_percent': 0.0}, {'name': 'sddm-helper', 'cpu_percent': 0.0}, {'name': 'systemd', 'cpu_percent': 0.0}, {'name': '(sd-pam)', 'cpu_percent': 0.0}, {'name': 'appimagelauncherfs', 'cpu_percent': 0.0}, {'name': 'appimagelauncherd', 'cpu_percent': 0.0}, {'name': 'kwalletd5', 'cpu_percent': 0.0}, {'name': 'startkde', 'cpu_percent': 0.0}, {'name': 'dbus-daemon', 'cpu_percent': 0.0}, {'name': 'start_kdeinit', 'cpu_percent': 0.0}, {'name': 'kdeinit5', 'cpu_percent': 0.0}, {'name': 'klauncher', 'cpu_percent': 0.0}, {'name': 'kded5', 'cpu_percent': 0.0}, {'name': 'kaccess', 'cpu_percent': 0.0}, {'name': 'kwrapper5', 'cpu_percent': 0.0}, {'name': 'ksmserver', 'cpu_percent': 0.0}, {'name': 'kglobalaccel5', 'cpu_percent': 0.0}, {'name': 'dconf-service', 'cpu_percent': 0.0}, {'name': 'kwin_x11', 'cpu_percent': 0.0}, {'name': 'baloo_file', 'cpu_percent': 0.0}, {'name': 'krunner', 'cpu_percent': 0.0}, {'name': 'plasmashell', 'cpu_percent': 0.0}, {'name': 'polkit-kde-authentication-agent-1', 'cpu_percent': 0.0}, {'name': 'xembedsniproxy', 'cpu_percent': 0.0}, {'name': 'kactivitymanagerd', 'cpu_percent': 0.0}, {'name': 'gmenudbusmenuproxy', 'cpu_percent': 0.0}, {'name': 'kdeconnectd', 'cpu_percent': 0.0}, {'name': 'msm_kde_notifier', 'cpu_percent': 0.0}, {'name': 'octopi-notifier', 'cpu_percent': 0.0}, {'name': 'pulseaudio', 'cpu_percent': 0.0}, {'name': 'rtkit-daemon', 'cpu_percent': 0.0}, {'name': 'AppRun', 'cpu_percent': 0.0}, {'name': 'python3', 'cpu_percent': 0.0}]

Но по какой-то причине использование процессора всегда 0 для каждого процесса. Это просто не будет работать для wordcloud. Разница в их размерах зависит от загрузки ЦП.

Я делаю что-то неправильно? Есть ли альтернативный способ сделать это, который действительно работает правильно?


person Iverol    schedule 03.09.2019    source источник
comment
Я думаю, вам нужно вызывать его несколько раз, чтобы он мог разделить разницу во времени ЦП на прошедшее время между вызовами для расчета процента.   -  person Barmar    schedule 03.09.2019
comment
такое поведение описано в документации psutils , чтобы получить значимый результат, следуйте @ ответ Бармара   -  person bigdataolddriver    schedule 03.09.2019


Ответы (1)


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

Поэтому позвоните один раз, подождите немного, а затем позвоните снова.

import psutil # for the linux process data and cpu usage
import time # for sleep()

# Initial call to get base values
_ = list(psutil.process_iter()
# Delay so it can calculate a difference.
time.sleep(1)

#Creates a list to store the output of procInfo
theOneProcessList = list()

# Lists every process and it's cpu usage and appends it to theOneProcessList
for proc in psutil.process_iter(attrs=None, ad_value=None):
    procInfo = proc.as_dict(attrs=['name', 'cpu_percent'])
    theOneProcessList.append(procInfo)
print(theOneProcessList)
person Barmar    schedule 03.09.2019
comment
это имеет смысл. Я хочу попробовать, но vscode продолжает жаловаться, что в ОС нет метода сна - person Iverol; 03.09.2019
comment
Это потому, что он находится в модуле time. - person Barmar; 03.09.2019
comment
1 секунда слишком мала для наблюдаемой цифры. 3 или 5 секунд может быть лучше. и исключения, такие как NoSuchProcess, должны быть перехвачены при выполнении длительного цикла - person bigdataolddriver; 03.09.2019
comment
Правильно, такие утилиты, как top, обычно обновляются каждые 5 или 10 секунд. - person Barmar; 03.09.2019
comment
все еще не работает. cpu_percent по-прежнему равен 0 для каждого процесса. Я тоже пробовал со сном 10 секунд - person Iverol; 03.09.2019
comment
Я в значительной степени отказался от идеи вместо этого использовать memory_percentage. Это дает результат и будет работать, но не так, как раньше. - person Iverol; 03.09.2019