编程之美中CPU运行曲线题目(多核版本)
2016-01-22 12:07
162 查看
昨天完成了编程之美中的控制CPU运行曲线的题目,如果CPU为多核,导致其使用率最多只能用到某单核的100%,,而且可能会存在程序在核间转移等情况,所以针对多核需要一个单独的版本。有如下几点:
1)由于Python中GIL的存在,因此其多线程版本可能无效,而多进程则容易将不同进程分配到不同核上,容易一致;
2)每个核上直接启动一个单核版本程序是不行的,如果启动时间有误差或者中间执行误差,会导致不同步,因此需要在中间过程中一直同步;
如下是完成的代码,主进程仍然采用单核版本同步,其在计算使用率时将该值通过queue传递给其他进程进行同步。
结果如下,注意在windows环境下使用multiprocessing库需要使用命令行执行,用IDLE执行是不行的。
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执行是不行的。
相关文章推荐
- javaEE之------SpringMVC中ResourceBundleViewResolver简单应用
- 用Matplotlib绘制二维图像
- ThinkPHP中U方法 在模板输出变量给 U方法传参 小记
- Java基础之AtomicInteger
- ①C#,利用数组求一个范围内的质数
- php读取超大日志文件
- 坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)
- C# Best Practices - Specify Clear Method Parameters
- Python下科学计算包numpy和SciPy的安装【原创】
- GitHub详细教程
- 【代码笔记】电影上的花絮,自动滚动
- 【代码笔记】电影上的花絮,自动滚动
- PHP curl_setopt函数用法介绍补充篇
- Java基础之volatile,static,synchronized的区别
- Java 进阶——自动装箱和自动拆箱
- 深入分析C++中char * 和char []的区别
- Qt遇到链接问题
- Asp.Net中动态页面转静态页面
- 这样的谷歌街景,你肯定没见过
- C++下如何更好的定义结构体