python multiprocessing 是不是利用多核

如题所述

总结一下之前的项目,主要用到了Python多进程的知识,其他的一些零碎的辅助知识也会用到,这里主要对整体框架进行总结,至于性能,因为经验问题,不能优化的很好,加上本项目有很多文件的读写,只能算稳定而已。
这个项目是大量的音频文件格式和频率转换,大概300多万个,一个转成7个,原来那个也要用,也就是说最后大概有300*8W个文件,总共大概2T的数据。好了,回忆下要求,首先转换过程中不能破坏原始文件的目录结构;第二,保证所有文件都转换过;第三,异常检测,日志分析,进度检测;第四,保证意外死机等情况下,重新跑代码可以继续执行上次中断的位置而不是要重复在进行转换(重复转换会出现1个文件本来转成8个了,那重复执行,这8个又会各自再生出8个,就产生错误了);最后,分析汇总错误日志,得到最终处理结果,问题文件汇总查看原因。
其实说白了,就是保证不出现不可逆的错误,保证稳定执行,保证准确,保证完整,保证效率。那么我们要有一个解决问题的思路,一开始说是,有好几台机器可用,就用分布式框架吧,例如Hadoop。。可惜时间短任务重,从头学的话,不得至少一个月?还是Python来的快,多进程执行,多核利用,有几个核就开几个进程,标准库multiprocessing完全可以胜任,一开始想的是thread多线程,后来想到Python的多线程不是类似Java的多线程,Python有一个全局锁机制,多个线程其实并不是并行执行(是不是并发更准确?),而是轮换执行,况且不能有效利用多核,那就确定最终的路线是:multiprocessing+多核(我用的进程池Pool,因为自己一个一个造的进程容易出错,而且性能也没有Pool好),具体的代码后面再说。
好了,下面就说代码吧,首先要从给定的目录中找到目标文件作为待处理任务列表,我写的函数如下:

[python] view plain copy print?
<span style="font-size:14px;">def get_filepath(src):

filepath = collections.deque()

for root,dirs,files in os.walk(src):
for afile in files:
if "_" not in afile:
filepath.append(os.path.join(root,afile))
return filepath
</span>
温馨提示:答案为网友推荐,仅供参考