我创建了一个bash脚本来自动化多个工具。这个bash脚本将一个字符串作为输入,并对其执行多个任务。粗布的结构类似
#!/bin/bash
tool1 $1
tool2 $1
tool3 $1
tool4 $1
tool5 $1
我想使用Python3多处理器来同时/并行运行n个工具,以加快进程。如何在Python中完成?
请使用multiprocessing
和subprocess
。使用自定义shell脚本时,如果它不在PATH中,则使用该脚本的完整路径。如果您的脚本与python脚本位于同一文件夹中,请使用./script.sh
作为命令。
还要确保您正在运行的脚本具有exec权限
from multiprocessing import Pool
import subprocess
def run_script(input):
(command,arg_str)=input
print("Starting command :{} with argument {}".format(command, arg_str))
result = subprocess.call(command+" "+arg_str, shell=True)
print("Completed command :{} with argument {}".format(command, arg_str))
return result
with Pool(5) as p: # choose appropriate level of parallelism
# choose appropriate command and argument, can be fetched from sys.argv if needed
exit_codes = p.map(run_script, [('echo','hello1'), ('echo','hello2')])
print("Exit codes : {}".format(exit_codes))
您可以使用退出代码来验证完成状态。样本输出:
Starting command :echo with argument hello1
Starting command :echo with argument hello2
hello1
hello2
Completed command :echo with argument hello1
Completed command :echo with argument hello2
Exit codes : [0, 0]
另一种方法(没有python(是使用GNU并行。下面的命令执行与上面的python脚本相同的操作。
parallel -k echo ::: 'hello1' 'hello2'
您可以将multiprocessing.pool.Pool
与os.system
一起使用,如下所示:
import sys
import os
import multiprocessing
tools = ['tool1', 'tool2', 'tool3', 'tool4', 'tool5']
arg1 = sys.argv[1]
p = multiprocessing.Pool(len(tools))
p.map(os.system, (t + ' ' + arg1 for t in tools))
这将启动执行os.system('toolN arg')
的len(tools)
并行进程。
不过,通常情况下,您不需要Pool(len(tools))
,因为如果您启动的进程数量超过了机器上可用的内核数量N,那么它的扩展性就不好,所以您应该使用Pool()
。这仍然会执行每个工具,但最多同时执行N个。