暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用Python让Windows的CPU利用率呈现正弦波

生有可恋 2022-09-23
1917

这是《编程之美》书中的一道题,不同的语言有不同的实现方法。通过实验可以证明当调用 time.sleep() 时 CPU 处于空闲状态,当做其它运算时 CPU 处于忙碌状态。

简单的测试代码:

    #!python3


    from datetime import datetime
    import time
    import psutil


    p = psutil.Process()
    p.cpu_affinity([0])


    while True:
    start_time = datetime.now()
    curren_time = datetime.now()
    v = curren_time - start_time
    f = v.seconds + v.microseconds*0.000001
    while f < 10:
    curren_time = datetime.now()
    v = curren_time - start_time
    f = v.seconds + v.microseconds*0.000001
    time.sleep(10)

    通过让 CPU 处于 sleep 和做其它运算之间间歇性切换,即可以得到“方波”,当然因为机器上还有其它任务在运行,所以波形会有毛刺。


    在多核CPU上,Windows 上的任务会随机分到不同的核上。为了控制波形,我们把任务绑在 CPU-0 上。通过控制 CPU 的 sleep 时间,当一直 sleep,CPU 占用率为 0% ,当一直忙,则 CPU 处于 100%,当间隙让CPU 休息,则 CPU 处于 50%。我们把轮休间隔设置为0.01秒,得到的便是如下50%利用率的波形(有毛刺)。

      #!python3


      from datetime import datetime
      import time
      import psutil


      p = psutil.Process()
      p.cpu_affinity([0])


      while True:
      start_time = datetime.now()
      curren_time = datetime.now()
      v = curren_time - start_time
      f = v.seconds + v.microseconds*0.000001
      while f < 0.01:
      curren_time = datetime.now()
      v = curren_time - start_time
      f = v.seconds + v.microseconds*0.000001
      time.sleep(0.01)


      如果想得到正弦波,则需要让 CPU 工作的时间和休息的时间随正弦数值进行调整。测试代码如下:

        #!python3


        import psutil
        import itertools, math, time, sys


        p = psutil.Process()
        p.cpu_affinity([0])


        time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30 # seconds
        time_slice = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # seconds


        N = 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_time
        while t > time.perf_counter():
        pass
        time.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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论