十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
总结一下之前的项目,主要用到了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
比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。
1、首先多进程是在各自单独的进程内存管理下运行代码,而多线程是共享一个进程内存。
2、其次首先打开m1macpython,点击主界面。
3、最后在主菜单点击调用多核即可。