这是《编程之美》书中的一道题,不同的语言有不同的实现方法。通过实验可以证明当调用 time.sleep() 时 CPU 处于空闲状态,当做其它运算时 CPU 处于忙碌状态。
简单的测试代码:
#!python3from datetime import datetimeimport timeimport psutilp = psutil.Process()p.cpu_affinity([0])while True:start_time = datetime.now()curren_time = datetime.now()v = curren_time - start_timef = v.seconds + v.microseconds*0.000001while f < 10:curren_time = datetime.now()v = curren_time - start_timef = v.seconds + v.microseconds*0.000001time.sleep(10)
通过让 CPU 处于 sleep 和做其它运算之间间歇性切换,即可以得到“方波”,当然因为机器上还有其它任务在运行,所以波形会有毛刺。

在多核CPU上,Windows 上的任务会随机分到不同的核上。为了控制波形,我们把任务绑在 CPU-0 上。通过控制 CPU 的 sleep 时间,当一直 sleep,CPU 占用率为 0% ,当一直忙,则 CPU 处于 100%,当间隙让CPU 休息,则 CPU 处于 50%。我们把轮休间隔设置为0.01秒,得到的便是如下50%利用率的波形(有毛刺)。
#!python3from datetime import datetimeimport timeimport psutilp = psutil.Process()p.cpu_affinity([0])while True:start_time = datetime.now()curren_time = datetime.now()v = curren_time - start_timef = v.seconds + v.microseconds*0.000001while f < 0.01:curren_time = datetime.now()v = curren_time - start_timef = v.seconds + v.microseconds*0.000001time.sleep(0.01)

如果想得到正弦波,则需要让 CPU 工作的时间和休息的时间随正弦数值进行调整。测试代码如下:
#!python3import psutilimport itertools, math, time, sysp = psutil.Process()p.cpu_affinity([0])time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30 # secondstime_slice = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # secondsN = int(time_period time_slice)for i in itertools.cycle(range(N)):busy_time = time_slice 2 * (math.sin(2*math.pi*i/N) + 1)t = time.perf_counter() + busy_timewhile t > time.perf_counter():passtime.sleep(time_slice - busy_time)

(图:任务管理器)

(图:资源管理器)
Windows 10 的任务管理器的 “性能” 标签页 和资源管理器中都可以查看CPU的利用率波形图。任务管理器中的CPU波形图默认是总体利用率,可以在波形上右键切换到逻辑处理器。

除了在程序中控制在哪个核上运行,在资源管理器的进程纤细信息中也可以设置在哪个核上运行。

参考:
https://stackoverflow.com/questions/551494/write-code-to-make-cpu-usage-display-a-sine-wave
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




