Python의 psutil을 사용한 CPU 사용량 병렬 모니터링
16025 단어 python
멀티스레딩을 사용하면 기본 프로세스를 중지하지 않고 주기적으로 실행할 수 있습니다. 컴퓨터 부하가 높은 시계열 데이터를 보고할 때 유용할 수 있습니다. 전체 코드는 하단에 있습니다.
라이브러리 설치
라이브러리psutil를 사용하여 Python에서 CPU 사용률을 얻을 수 있습니다. pip를 통해 설치할 수 있습니다.
pip install psutil
기본 사용법은 다음과 같습니다.
# percpu=True returns a list of utilization (%) per core
>>> psutil.cpu_percent(interval=1, percpu=True)
[7.0, 1.0, 8.9, 0.0, 5.0, 1.0, 4.0, 0.0]
# percpu=False returns an average utilization (%)
>>> psutil.cpu_percent(interval=1, percpu=False)
8.9
# Smaller interval(sec) shortens the measurement time, but also increases the error.
>>> psutil.cpu_percent(interval=0.5, percpu=True)
[6.0, 0.0, 7.8, 1.9, 4.0, 0.0, 5.8, 0.0]
병렬 처리
이번에는 네이티브 라이브러리threading를 사용하여 병렬 처리를 구현합니다.
다음과 같이 스레드 인스턴스를 생성하고 실행할 수 있습니다.
m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
m.start()
threading.Thread()
에 대한 인수로 target
는 실행할 메서드이고 args
는 메서드에 대한 인수입니다.monitor_cpu
는 모니터링 방법입니다.모니터링 방법
threading.Event
를 사용하여 모니터링 스레드를 관리합니다.threading.Event
는 이벤트가 발생할 때까지 스레드를 기다리게 한 다음 다른 스레드에서 이벤트가 발생하면 대기 중인 스레드를 재개하는 데 사용됩니다.우리는 2개의 이벤트를 사용합니다.
wait(timeout)
: 이벤트가 발생하거나 timeout
초가 경과할 때까지 현재 스레드를 대기시킵니다. set()
: 이벤트를 발생시킵니다.def monitor_cpu(initial_time):
print("START monitor_cpu")
while not event.wait(1): # Wait for 1 second, if no event occurs, execute inside the loop and wait again
elapsed_time = time.time() - initial_time
cpu_percent = psutil.cpu_percent(percpu=True)
cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
print("time:", int(elapsed_time), cpu_percent)
print("END monitor_cpu") # When an event occurs, exit the loop and terminate execution
if __name__=="__main__":
event = threading.Event()
initial_time = time.time()
m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
m.start()
# Main process
event.set() # Fires an event
내부
monitor_cpu
에서 실행 간격이 1초인 무한 루프가 실행됩니다. 이벤트가 발생하면 루프를 중단하고 실행을 종료합니다.def monitor_cpu(initial_time):
print("START monitor_cpu")
while flag:
time.sleep(1)
elapsed_time = time.time() - initial_time
cpu_percent = psutil.cpu_percent(percpu=True)
cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
print("time:", int(elapsed_time), cpu_percent)
print("END monitor_cpu")
if __name__=="__main__":
event = threading.Event()
initial_time = time.time()
flag = True
m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
m.start()
tmp = 0
for i in range(100000000):
tmp = i+i
flag = False
전체 코드
import threading
import time
import psutil
def monitor_cpu(initial_time):
print("START monitor_cpu")
while not event.wait(1):
elapsed_time = time.time() - initial_time
cpu_percent = psutil.cpu_percent(percpu=True)
cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
print("time:", int(elapsed_time), cpu_percent)
print("END monitor_cpu")
if __name__=="__main__":
event = threading.Event()
initial_time = time.time()
m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
m.start()
tmp = 0
for i in range(100000000):
tmp = i+i
event.set()
결과
왼쪽에서 오른쪽으로: 시간(초), CPU1 사용률(%), CPU2 사용률 ... CPU8 사용률.
START monitor_cpu
time: 1 52.0 1.0 29.7 1.0 28.7 2.0 30.4 0.0
time: 2 45.0 3.0 36.3 3.0 32.4 1.0 29.4 1.0
time: 3 43.6 2.0 31.0 1.0 33.7 0.0 27.7 2.0
time: 4 45.5 2.0 25.2 1.0 22.8 0.0 19.8 0.0
time: 5 41.6 1.0 26.0 1.0 26.7 1.0 20.8 1.0
time: 6 46.1 5.0 34.7 3.0 38.0 3.0 31.7 4.0
time: 7 63.0 10.0 52.5 10.0 55.4 10.9 55.0 10.0
time: 8 51.5 6.9 36.0 4.9 41.2 5.0 39.6 4.9
time: 9 55.0 0.0 20.6 1.0 26.0 0.0 14.9 0.0
time: 10 49.5 2.9 22.8 1.0 25.2 1.0 23.5 1.0
time: 11 43.6 1.0 32.7 0.0 28.3 0.0 23.8 1.0
time: 12 47.5 2.9 22.8 1.0 20.6 2.0 25.0 2.0
END monitor_cpu
Reference
이 문제에 관하여(Python의 psutil을 사용한 CPU 사용량 병렬 모니터링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kosukeszk/parallel-monitoring-of-cpu-usage-with-pythons-psutil-2946텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)