如何在python中控制进程?

时间:2015-11-01 13:33:28

标签: python multithreading process parallel-processing multiprocessing

我希望并行运行多个进程而不给cpu太多工作,这样cpu也可以做其他工作。

在python中,我将使用os.system来调用一些二进制文件。这些呼叫是独立的,可以是并行的。但是这些二进制文件可能会运行不同的时间长度。

我想要做的是,例如,总是保持其中8个并行运行,如果有一个提前退出,则启动另一个。

我现在正在做的是这样的:

count = 0
for f in files:
    count = count + 1
    cmd = exe 
    if (count != 8):
        cmd = cmd + " &"
    else:
        count = 0
    os.sytem(cmd)

但如果cmd没有&运行太长或太短。

我也尝试过多处理模块,

p=Pool(8)
print(p.map(f,list_of_args))

但在这种情况下,我大部分时间并没有并行运行8个进程。因为他们中的一些人很早就退出了。

无需同步。

我有16个cpu核心,我想要一半(8个进程并行运行)

1 个答案:

答案 0 :(得分:1)

您最好不要使用os.system,而是使用subprocess.Popen,因为它更强大,更安全。此外subprocess.Popen不会阻止通话,因此您不需要附加任何'&'在命令的最后。

对于问题本身,您需要知道操作系统在自动平衡工作负载方面非常出色,因此您不必担心空闲进程与正在运行的进程。只需使用Pool启动您的工作人员,让他们一直运行直到需要,而不必担心会浪费'任何资源。闲置过程只需要一点记忆就可以了。

在改进代码时,您可能想要使用的是一个线程池而不是一个进程池。这是因为您的工作人员只是在等待其他工作人员完成,因此线程优于流程。

如果您可以使用Python 3这样的事情将为您完成这项工作。

import subprocess
from concurrent.futures import ThreadPoolExecutor


def function(myfile):
    command = ('watever', 'you', 'want', 'to', 'do', 'with', myfile)
    process = subprocess.Popen(command, stdout=subprocess.PIPE)
    process.communicate()


with ThreadPoolExecutor(max_workers=8) as executor:
    future = executor.map(function, files)
    future.result()