【问题标题】:Threading optimization. Running many commands on a list of files线程优化。在文件列表上运行许多命令
【发布时间】:2017-08-29 16:55:18
【问题描述】:

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

我会有这样的东西:

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...

谢谢你,对这个如此笼统的问题感到抱歉。

【问题讨论】:

    标签: python multithreading python-3.x subprocess


    【解决方案1】:

    不确定您是否需要一个流程.. 但以防万一,请看这里: 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%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多