首页 技术 正文
技术 2022年11月19日
0 收藏 436 点赞 4,126 浏览 2222 个字

平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管理器中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:

 #main.py
import multiprocessing
import time
import numpy as np
from func import writeln
from calc import calc
import scipy.io as sio def func1(x):
calc()
c1=0
d1=np.zeros(233,int)
for i in xrange(5):
d1[c1]=writeln(1,i)
c1+=1
#time.sleep(1)
sio.savemat('11.mat',{'dd':d1}) def func2(x):
calc()
c2=0
d2=np.zeros(233,int)
for i in xrange(5):
d2[c2]=writeln(2,i)
c2+=1
#time.sleep(1)
sio.savemat('22.mat',{'dd':d2}) def func3(x):
calc()
c3=0
d3=np.zeros(233,int)
for i in xrange(5):
d3[c3]=writeln(3,i)
c3+=1
#time.sleep(1)
sio.savemat('33.mat',{'dd':d3}) def func4(x):
calc()
c4=0
d4=np.zeros(233,int)
for i in xrange(5):
d4[c4]=writeln(4,i)
c4+=1
#time.sleep(1)
sio.savemat('44.mat',{'dd':d4}) if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4) pool.apply_async(func1, (1, ))
pool.apply_async(func2, (2, ))
pool.apply_async(func3, (3, ))
pool.apply_async(func4, (4, )) pool.close()
pool.join() print "Sub-process(es) done."
 #func.py
def writeln(x,y):
aa=x*10+y
print(aa)
return(aa)
 #calc.py
def calc():
x=233
for i in xrange(1000000000):
x=x+1
x=x-1

main.py

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

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

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

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

calc.py

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

运行效果:

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

用Python实现多核心并行计算

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

用Python实现多核心并行计算

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

用Python实现多核心并行计算

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

Reference:

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

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

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,965
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,486
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,331
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,114
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,747
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,781