Python子流程批量调用

时间:2015-09-15 20:43:29

标签: python subprocess

我正在尝试创建一个变量批量大小,以进行子进程调用。我有点困惑在最好的方式让一批5开始,等待所有5完成而不是开始接下来的五个。

到目前为止我所拥有的是:

batchSize = 5
proccessArray = process.split(",")
processLength = len(proccessArray) - 1
counter1 = 0
for i in range(0, processLength, batchSize):
    for x in range(1, batchSize):
        d = {}
        if counter1 < processLength:
            dgclOutput = inputPath + st + "_" + (i + x) + "output"
            d["process{0}".format(x)] = subprocess.Popen(proccessArray(i + x) + ">>" + dgclOutput, shell=True, stdout=subprocess.PIPE)
            counter1 + 1
        else:
            break

BatchSize是我一次要去的批次数。 Process Array是需要调用的命令列表。进程长度是可能的命令量。计数器在达到最大值时将跳出循环。

因此,我的第一个循环步骤是批量大小,而不是在字典中创建5个子对象以启动的内部循环。

此代码不起作用,任何人都知道如何使其工作或更好的解决方案?

3 个答案:

答案 0 :(得分:1)

我认为你可能正在寻找这些方面的东西:

batchSize = 5
processArray = process.split(",")
for i in xrange(0, len(processArray), batchSize):
    batch = processArray[i:i+batchSize]  # len(batch) <= batchSize
    ps = []
    for process in batch:
        output = "..."
        p = subprocess.Popen(process + ">>" + output, shell=True, stdout=subprocess.PIPE)
        ps.append(p)
    for p in ps:
        p.wait()

答案 1 :(得分:0)

你想做这样的事情。假设您有一个要运行的所有命令的列表 public function destroy($id) { $article= Article::findOrFail($id); $article->delete(); return redirect('dashboard'); // example.... }

commands

(Chunks函数from this answer。)

答案 2 :(得分:0)

您需要.communicate()模块的.wait()subprocess个函数来等待进程完成。或者,您可以使用.poll()查看子进程是否已完成。

batchSize = 5
proccessArray = process.split(",")
processLength = len(proccessArray) - 1
counter1 = batchSize
for i in range(0, processLength, batchSize):
    d = {}
    for x in range(1, batchSize):
        dgclOutput = inputPath + st + "_" + (i + x) + "output"
        d["process{0}".format(x)] = subprocess.Popen(proccessArray(i + x) + ">>" + dgclOutput, shell=True, stdout=subprocess.PIPE)
    while not counter1:
        for p in d:
            if not p.poll():
               counter1 -= 1

这里有一个更好的例子:Python subprocess in parallel