我希望并行运行多个进程而不给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个进程并行运行)
答案 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()