0

我编写了一个 python 脚本,它监视新子目录的目录,然后循环作用于每个子目录。我们有一个创建这些子目录的外部进程。每个子目录中都有一个文本文件和一些图像。每个图像的文本文件中有一个记录(行)。对于每个子目录,我的脚本扫描文本文件,然后调用一些外部程序,一个检测空白图像(自定义 exe),然后调用“mogrify”(ImageMagick 的一部分)调整图像大小并转换图像,最后调用 7 -zip 将所有转换后的图像和文本文件打包到一个存档中。

该脚本运行良好,但目前是连续的。一次循环遍历每个子目录。在我看来,这将是进行多处理的好机会,因为这是在双 CPU 机器(总共 8 个内核)上运行的。

给定子目录的处理独立于所有其他子目录……它们是自包含的。

目前,我只是使用调用 os.listdir() 创建子目录列表,然后循环遍历该列表。我想我可以将所有每个子目录的代码(转换等)移动到一个单独的函数中,然后以某种方式创建一个单独的进程来处理每个子目录。由于我对 Python 有点陌生,因此将不胜感激有关如何处理这种多处理的一些建议。我在运行 Python 2.6 的 Vista x64 上。

4

1 回答 1

0

我同意这种设计听起来可以从并发中受益。看看多处理模块。您可能还想查看线程模块,并比较速度。很难确切地说出需要多少内核才能从多处理与线程中获益,而八个内核正好在线程可能更快的范围内(是的,尽管有 GIL)。

从设计的角度来看,我最大的建议是尽可能完全避免流程之间的交互。让一个中心线程查找触发进程创建的事件(我猜这是创建子目录?),然后生成一个进程来处理子目录。从那时起,生成的进程不应该与任何其他进程交互。从您的描述看来,这应该是可能的。

最后,我想对迁移到Python 3.0说一句鼓励的话。有很多关于继续使用 2.x 的讨论,但 3.0 确实做出了一些真正的改进,并且随着越来越多的人开始转向 Python 3.0,获得对 2.x 的工具和支持将变得更加困难。

于 2009-08-26T06:09:45.727 回答