我正在尝试创建一个变量批量大小,以进行子进程调用。我有点困惑在最好的方式让一批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个子对象以启动的内部循环。
此代码不起作用,任何人都知道如何使其工作或更好的解决方案?
答案 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