我已经编写了一个python脚本,它监视目录中是否有新的子目录,然后在循环中对每个子目录执行操作。我们有一个创建这些子目录的外部进程。在每个子目录中都有一个文本文件和一些图像。对于每个图像,文本文件中都有一条记录(行)。对于每个子目录,我的脚本扫描文本文件,然后调用一些外部程序,其中一个检测空白图像(自定义可执行文件),然后调用"mogrify“(ImageMagick的一部分)来调整图像大小并转换图像,最后调用7-zip将所有转换后的图像和文本文件打包到一个单独的归档中。
该脚本运行良好,但当前是连续的。一次循环遍历每个子目录。在我看来,这将是一个做一些多处理的好机会,因为这是在双CPU机器上运行的(总共8个核心)。
给定子目录的处理是独立的,所有的others...they都是自包含的。
目前,我正在使用对os.listdir()的调用创建一个子目录列表,然后遍历该列表。我认为我可以将每个子目录的所有代码(转换等)移到一个单独的函数中,然后以某种方式创建一个单独的进程来处理每个子目录。由于我对Python比较陌生,因此对如何处理此类多进程提出一些建议将不胜感激。我在Vista x64上运行Python2.6。
发布于 2009-08-26 06:09:46
我同意这种设计听起来可以从并发性中获益。看看the multiprocessing module吧。你可能还想看看the threading module,比较一下速度。很难准确地说出需要多少个内核才能从多处理和线程中获益,8个内核在线程速度可能更快的范围内(是的,尽管有GIL)。
从设计的角度来看,我最大的建议是尽可能避免进程之间的交互。让一个中央线程查找触发进程创建的事件(我猜这是一个子目录创建?)然后产生一个进程来处理该子目录。从那时起,衍生的进程将不再与任何其他进程交互。从你的描述来看,这似乎是可能的。
最后,我想补充一句鼓励迁移到Python 3.0的话。有很多关于继续使用2.x的讨论,但3.0确实做了一些真正的改进,随着越来越多的人开始迁移到Python3.0,获得2.x的工具和支持将变得更加困难。
https://stackoverflow.com/questions/1332583
复制相似问题