У меня есть многопроцессорный код, в котором я хочу назначить конкретный ЦП конкретному процессу. Я не хочу использовать канал для установления связи между родительским и дочерним процессом. Вот код:
import multiprocessing as mp
import psutil
def spawn():
procs = list()
conns = list()
n_cpus = psutil.cpu_count()
percentage = int(input("Enter Percentage"))
proc_num = (percentage * n_cpus)//100
for cpu in range(proc_num):
affinity = cpu
parent_conn, child_conn = Pipe()
p = Process(target=run_child, args=(child_conn,affinity,))
p.start()
procs.append(p)
conns.append(parent_conn)
for conn in conns:
try:
print(conn.recv())
except EOFError:
continue
time.sleep(exec_time)
def run_child(conn, affinity):
proc = psutil.Process()
proc_info = proc.pid
msg = "Process ID: "+str(proc_info)+" CPU: "+str(affinity)
conn.send(msg)
conn.close()
proc.cpu_affinity(affinity)
while True:
1*1
if __name__ == '__main__':
spawn()
Теперь я ввожу процент и проверяю использование per_cpu, используя этот код:
import psutil, time
while True:
print(psutil.cpu_percent(percpu=True)
time.sleep(1)
Это показывает количество ядер на 100% в соответствии с Процент ЦП, введенный пользователем (например, для 6 ядер, работающих на 100%, если пользователь вводит использование ЦП 50%, у меня есть 12 логических ядер). Я создал инструмент matplotlib для мониторинга загрузки ЦП и памяти в реальном времени, используя psutil
. Теперь psutil точно показывает, сколько ЦП используется, вот снимок экрана системы, работающей с использованием ЦП 50%:
And this is the output of percpu utilization:
E:\Internship\Load_creation\stress_test>python per_cpu.py
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
[3.1, 1.6, 20.3, 1.6, 4.7, 0.0, 1.6, 0.0, 100.0, 0.0, 3.1, 31.2]
[73.9, 67.2, 76.6, 64.1, 78.1, 67.2, 20.3, 1.6, 35.9, 3.0, 36.9, 3.1]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 4.7, 20.3, 3.1, 4.7, 4.7, 14.1]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 18.8, 0.0, 7.7, 1.6, 4.7, 1.6]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 3.1, 1.5, 16.9, 1.5, 4.6, 0.0]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 6.2, 1.6, 6.2, 3.1, 3.1, 15.6]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 7.7, 4.7, 7.8, 4.7, 7.8, 7.8]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 15.6, 9.4, 14.1, 6.2, 12.5, 3.1]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 29.7, 6.2, 4.7, 7.8, 7.8, 7.8]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 33.8, 32.3, 23.1, 35.4, 44.6, 15.4]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 32.8, 29.7, 30.8, 17.2, 42.2, 26.6]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 29.7, 34.4, 40.6, 12.5, 40.0, 23.4]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 21.5, 39.1, 26.2, 15.6, 38.5, 32.8]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 48.4, 18.8, 32.3, 14.1, 26.6, 31.2]
[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 1.5, 16.9, 1.5, 1.5, 1.5, 1.5]
The readings seem correct apart from the spike in usage of other cores which I couldn't understand. Now the problem is that, the task manager at the same time, shows these readings:
введите описание изображения здесь
Q1: Почему существует такая несогласованность в показаниях psutils и taskmanager?
Q2: Почему наблюдается всплеск в других ядрах, когда я не назначаю ни одного процессы к ним?