我编写了一个python脚本,它监视新子目录的目录,然后作用于循环中的每个子目录。我们有一个创建这些子目录的外部进程。每个子目录中都有一个文本文件和许多图像。每个图像的文本文件中都有一个记录(行)。对于每个子目录,我的脚本扫描文本文件,然后调用一些外部程序,一个检测空白图像(自定义exe),然后调用“mogrify”(ImageMagick的一部分)调整大小并转换图像,最后调用7 -zip将所有转换后的图像和文本文件保存到一个存档中。
脚本运行正常,但目前是顺序的。一次一个地循环每个子目录。在我看来,这将是一个很好的机会进行一些多处理,因为这是在双CPU机器上运行(总共8个核心)。
给定子目录的处理独立于所有其他子目录......它们是自包含的。
目前我只是使用对os.listdir()的调用创建一个子目录列表,然后循环遍历该列表。我想我可以将所有的子目录代码(转换等)移动到一个单独的函数中,然后以某种方式创建一个单独的进程来处理每个子目录。由于我对Python有些新意,因此可以理解一些关于如何处理这种多处理的建议。我在Vista x64上运行Python 2.6。
答案 0 :(得分:0)
我同意这种设计听起来好像可以从并发中受益。看看the multiprocessing module。您可能还想查看the threading module,并比较速度。很难确切知道有多少核心需要从多处理和线程中获益,而且八个核心在线程可能更快的范围内(是的,尽管有GIL)。
从设计角度来看,我最大的建议是尽可能避免流程之间的互动。让一个中心线程查找触发进程创建的事件(我猜它是一个子目录创建?)然后生成一个进程来处理子目录。从那时起,生成的进程不应该与任何其他进程交互。从您的描述看,这似乎应该是可能的。
最后,我想补充一句鼓励搬到Python 3.0。有很多关于使用2.x的讨论,但3.0确实做了一些真正的改进,随着越来越多的人开始转向Python 3.0,获得2.x的工具和支持将变得更加困难。 p>