热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python怎么实现并行_用Python实现多核心并行计算

平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管

平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管理器中CPU使用量还是只有50%(双核CPU)或25%(四核CPU)

如果能让一个程序自己建立出多个进程,并且让它们并行运行,那么就可以在不同cpu核心上同时运行,进而实现并行计算啦。

Python的并行计算就是这么做的。

之前的理解错了......还是要学习一个

1、多线程与多进程

之前OS课学过.....

in general,线程是比进程低一级的调度单位。一个进程可以包含多个进程。

线程之间的切换相对于进程之间更为方便,代价也更低。所以讲道理多线程的效率比多进程是要高的。

Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

【ref:http://blog.csdn.net/delacroix_xu/article/details/5928121

2.多线程与Python

好多语言都可以很好的资词多线程。然而Python是个例外......

对于IO密集型的任务,使用多线程还是能提高一下CPU使用率。对于CPU密集型的任务,Python中的多线程其实是个鸡肋......没卵用......

在Python的解释器CPython中存在一个互斥锁。简单来讲就是同一时间只能有一个线程在执行,其它线程都处于block模式。

【ref:https://www.zhihu.com/question/22191088

3.多进程

要想在py中充分利用多核cpu,就只能用多进程了。

虽然代价高了些,但是比起并行计算带来的性能提升这些也微不足道了。最重要的是好!写!啊!

这里来看第一个sample:

1 #main.py

2 importmultiprocessing3 importtime4 importnumpy as np5 from func importwriteln6 from calc importcalc7 importscipy.io as sio8

9 deffunc1(x):10 calc()11 c1=012 d1=np.zeros(233,int)13 for i in xrange(5):14 d1[c1]=writeln(1,i)15 c1+=1

16 #time.sleep(1)

17 sio.savemat('11.mat',{'dd':d1})18

19 deffunc2(x):20 calc()21 c2=022 d2=np.zeros(233,int)23 for i in xrange(5):24 d2[c2]=writeln(2,i)25 c2+=1

26 #time.sleep(1)

27 sio.savemat('22.mat',{'dd':d2})28

29 deffunc3(x):30 calc()31 c3=032 d3=np.zeros(233,int)33 for i in xrange(5):34 d3[c3]=writeln(3,i)35 c3+=1

36 #time.sleep(1)

37 sio.savemat('33.mat',{'dd':d3})38

39 deffunc4(x):40 calc()41 c4=042 d4=np.zeros(233,int)43 for i in xrange(5):44 d4[c4]=writeln(4,i)45 c4+=1

46 #time.sleep(1)

47 sio.savemat('44.mat',{'dd':d4})48

49 if __name__ == "__main__":50 pool = multiprocessing.Pool(processes=4)51

52 pool.apply_async(func1, (1, ))53 pool.apply_async(func2, (2, ))54 pool.apply_async(func3, (3, ))55 pool.apply_async(func4, (4, ))56

57 pool.close()58 pool.join()59

60

61 print "Sub-process(es) done."

1 #func.py

2 defwriteln(x,y):3 aa=x*10+y4 print(aa)5 return(aa)

1 #calc.py

2 defcalc():3 x=233

4 for i in xrange(1000000000):5 x=x+1

6 x=x-1

main.py

Line 49 新建一个进程池,并指定本机cpu核心数量为4

这样主程序运行时就会建立出4个额外的进程,每个进程可以运行在不同核心上,从而实现了多核并行

Line 51--54 将func1--func4这四个函数都加到进程池中。

注意,如果我们加入了超过4个func,那么同时只会有四个在运行。剩下的要排队等待

calc.py

这是一个死循环....是为了演示cpu使用量...

运行效果:

单个calc()运行时,CPU占用量是25%

638051-20160312001047350-676634229.png

启用multiprocessor之后,一共开启了5个python.exe进程(一个主+4个子进程),cpu占用100%。同时风扇也开始狂转......

638051-20160312001058679-267380996.png

因为并行运行时具有顺序不确定性(参考OS课本上的多线程),用print输出结果可能会乱。这里我们都保存到mat文件里。

638051-20160312001719866-1386321535.png

有了这种方法我就可以让我的训练数据集的程序也并行跑起来啦~特别爽

Reference:

http://www.coder4.com/archives/3352

http://www.cnblogs.com/kaituorensheng/p/4445418.html

http://rfyiamcool.blog.51cto.com/1030776/1357112



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
author-avatar
wiggin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有