线程优化。在文件列表上运行许多命令

时间:2017-08-29 16:55:19

标签: python multithreading python-3.x subprocess

我有一个必须在许多文件上运行的脚本。在每个文件中都有执行生成不同文件的外部命令,或者我需要在同一文件中操作,但是在不同的文件夹中。

我会有这样的事情:

Proc1_File1 -> Proc2.1_File1 -> Proc2.2_File1 -> Proc3.File1 -> Proc4.File1
Proc1_File2 -> Proc2.1_File2 -> Proc2.2_File2 -> Proc3.File2 -> Proc4.File2
Proc1_FileN -> Proc2.1_File2 -> Proc2.2_FileN -> Proc3.FileN -> Proc4.FileN

所以我在这个示例中总共有 5 个进程,但是例如Proc2.1Proc2.2可以同时运行。

此外,我还需要限制同时运行的进程数,主要是Proc2.2Proc3.3因为外部命令占用大量内存,所以运行超过4-5同时进程可能会导致内存非常低。

很抱歉这个问题非常通用,但我不知道从哪里开始以及如何解决这个问题。好像我必须按顺序运行每个进程,这将耗费太多时间。

所以,我认为我可能需要使用队列。我一直在使用列表来限制外部命令的执行,并在此处等待:

__list_commands.append(Popen(__command, shell=True, cwd=str(__p.parent)))
exit_codes = [p.wait() for p in __list_commands]

它将是运行第一个进程的函数的一部分。然而,这使得等待命令结束运行下一个,所以它顺序执行,我想并行运行每个进程,并按顺序运行每个进程,首先是proc1,然后是proc2 ......

谢谢你,对于这个如此普遍的问题感到抱歉。

1 个答案:

答案 0 :(得分:0)

不确定您是否需要流程..但以防万一看这里: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor

或者你只是需要线程? https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor

请记住,如果你产生3个线程,它们将在同一个CPU中运行,如果它们的任务是计算密集型的,那么每个线程将占用该CPU的33%。