编程之美中CPU运行曲线题目(多核版本)

昨天完成了编程之美中的控制CPU运行曲线的题目,如果CPU为多核,导致其使用率最多只能用到某单核的100%,,而且可能会存在程序在核间转移等情况,所以针对多核需要一个单独的版本。有如下几点:

1)由于Python中GIL的存在,因此其多线程版本可能无效,而多进程则容易将不同进程分配到不同核上,容易一致;

2)每个核上直接启动一个单核版本程序是不行的,如果启动时间有误差或者中间执行误差,会导致不同步,因此需要在中间过程中一直同步;

如下是完成的代码,主进程仍然采用单核版本同步,其在计算使用率时将该值通过queue传递给其他进程进行同步。

"""
控制CPU使用曲线(多核版本)
"""
import timeit
import time
import os
import multiprocessing
import math


def run_cpu():
    """
    消耗CPU运算时执行的程序
    """
    x = [_ for _ in range(RUN_RANGE_NUMBER)]


def idle_cpu():
    """
    保持CPU处于IDLE的Sleep程序
    """
    time.sleep(SLEEP_TIME)

TEST_TIME_NUMBERS = 100
RUN_RANGE_NUMBER = 100000   
SLEEP_TIME = timeit.timeit("run_cpu()", setup="from "+__name__+" import run_cpu", number=TEST_TIME_NUMBERS)/TEST_TIME_NUMBERS
print("测试运行100次,每次执行时间为:{}S".format(SLEEP_TIME))

    
def run_for_1s(percent):
    """
    1s中按照percent比例分别执行程序或者休眠
    """
    all_times = 0.33 / SLEEP_TIME
    cpu_times = all_times * percent / 100
        
    for _ in range(3):
        for i in range(int(all_times)):
            if i < cpu_times:
                run_cpu()
            else:
                idle_cpu()
                

def run_sin(queues):
    """
    使用sin函数
    """
    i = 0
    while True:
        i = i + 1
        use_age = 50 + math.sin(i/5)*50
        for q in queues:
            q.put(use_age)
        run_for_1s(use_age)


def run_second_process(queue, sleep_time):
    """
    其他核的执行函数
    """
    all_times = 1 / sleep_time
    
    while True:
        percent = queue.get()
        cpu_times = all_times * percent / 100
        
        for i in range(int(cpu_times)):
            run_cpu()

def main():
    core_num = os.cpu_count()
    queues = []
    if core_num:
        for i in range(core_num-1):
            q = multiprocessing.Queue()
            queues.append(q)
            p = multiprocessing.Process(target=run_second_process, args=(q, SLEEP_TIME))
            p.start()
    run_sin(queues)


if __name__ == '__main__':
    main()

结果如下,注意在windows环境下使用multiprocessing库需要使用命令行执行,用IDLE执行是不行的。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值