在Windows上进行Python多进程批量文件/转换操作
我写了一个Python脚本,它会监控一个文件夹,查看里面有没有新创建的子文件夹,然后对每个子文件夹进行处理。我们有一个外部程序会创建这些子文件夹。每个子文件夹里有一个文本文件和一些图片。文本文件里每一行对应一张图片。我的脚本会扫描每个子文件夹里的文本文件,然后调用几个外部程序:一个是用来检测空白图片的(自定义的exe程序),接着是“mogrify”(这是ImageMagick的一部分),它用来调整图片大小和格式,最后调用7-zip把所有转换后的图片和文本文件打包成一个压缩文件。
这个脚本运行得很好,但现在是顺序执行的,也就是说它一个一个地处理每个子文件夹。我觉得这是一个很好的机会来进行多进程处理,因为我是在一台双CPU的机器上运行(总共有8个核心)。
处理一个子文件夹的过程和其他子文件夹是独立的,也就是说它们之间没有关系。
目前我只是用os.listdir()来创建一个子文件夹的列表,然后对这个列表进行循环。我想我可以把每个子文件夹的处理代码(转换等)放到一个单独的函数里,然后以某种方式创建一个独立的进程来处理每个子文件夹。因为我对Python还不太熟悉,所以如果能给我一些关于如何进行多进程处理的建议,我会很感激。我是在Vista x64上运行Python 2.6。
1 个回答
我同意这个设计听起来可以通过并发来提升效率。你可以看看多进程模块。你也可以关注一下线程模块,然后比较一下它们的速度。要准确判断使用多进程和线程各需要多少个核心才能获得好处是比较难的,而八个核心的范围内,线程可能会更快(是的,尽管有全局解释器锁GIL的存在)。
从设计的角度来看,我最大的建议是尽量避免进程之间的相互作用。可以让一个中心线程去监测触发进程创建的事件(我猜是创建子目录?),然后再启动一个进程来处理这个子目录。从那以后,启动的进程就不应该和其他任何进程有交互,永远不要。从你的描述来看,这应该是可行的。
最后,我想鼓励你考虑升级到Python 3.0。虽然有很多人还在使用2.x版本,但3.0确实带来了一些实质性的改进,随着越来越多的人开始转向Python 3.0,获取2.x版本的工具和支持将会变得更加困难。