Если вы хотите построить линии вместо точек, см. этот пример , измененный здесь, чтобы отобразить хорошие / плохие точки, представляющие функцию как черный / красный, в зависимости от ситуации:
def plot(xx, yy, good):
"""Plot data
Good parts are plotted as black, bad parts as red.
Parameters
----------
xx, yy : 1D arrays
Data to plot.
good : `numpy.ndarray`, boolean
Boolean array indicating if point is good.
"""
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
from matplotlib.colors import from_levels_and_colors
from matplotlib.collections import LineCollection
cmap, norm = from_levels_and_colors([0.0, 0.5, 1.5], ['red', 'black'])
points = np.array([xx, yy]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lines = LineCollection(segments, cmap=cmap, norm=norm)
lines.set_array(good.astype(int))
ax.add_collection(lines)
plt.show()
Во-первых, вы должны понимать, что загрузка процессора всегда является средней за определенное время. В любой момент времени процессор либо работает, либо нет. Процессор никогда не работает на 40%.
Тем не менее, мы можем смоделировать нагрузку 40% в течение, скажем, секунды, если процессор будет работать в течение 0,4 секунды и в режиме сна 0,6 секунды. Это дает среднее использование в 40% за эту секунду.
Сокращение его до менее чем одной секунды, скажем, 100 миллисекундные куски должны дать еще более стабильное использование.
Следующий метод использует аргумент, который является желаемым использованием, а затем использует один процессор / ядро до такой степени:
public static void ConsumeCPU(int percentage)
{
if (percentage < 0 || percentage > 100)
throw new ArgumentException("percentage");
Stopwatch watch = new Stopwatch();
watch.Start();
while (true)
{
// Make the loop go on for "percentage" milliseconds then sleep the
// remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
if (watch.ElapsedMilliseconds > percentage)
{
Thread.Sleep(100 - percentage);
watch.Reset();
watch.Start();
}
}
}
Я использую здесь секундомер , потому что он является более точным, чем свойство TickCount , но вы также можете использовать это и использовать вычитание, чтобы проверить, достаточно ли долго вы работаете.
Следует иметь в виду две вещи:
Чтобы ответить на ваш второй вопрос об изменении использования через определенное время, я предлагаю вам запустить этот метод на одном или более потоков (в зависимости от количества ядер), а затем, когда вы хотите изменить использование, вы просто останавливаете эти потоки и порождаете новые с новыми процентными значениями. Таким образом, вам не нужно реализовывать связь между потоками, чтобы изменить percentage
работающего потока.