Python运行以在Parralel中运行Batch Command

时间:2016-04-28 20:57:33

标签: python multithreading pthreads subprocess

我有一个包含所有批处理命令的列表。(超过1000个)计数 我需要一次从这个列表中运行5个命令(并行),如果任何一个完成,第6个应该启动。

你能帮忙吗?感谢

1 个答案:

答案 0 :(得分:0)

如果您不需要批处理命令的输出,您可以简单地

import subprocess
subprocess.Popen("command string here", shell=True) 

这将在附加到此Python运行时的shell中运行批处理代码。

要并行运行,您只需跟踪当前运行的数量。我喜欢使用线程来实现这个

import subprocess
from threading import Thread
import time

processing = 0

def call_batch(command):
    global processing
    process = subprocess.Popen("command string here", shell=True)
    process.wait()
    processing -= 1

if __name__ == "__main__":
    commands = []
    ##load commands

    for command in commands:
        if processing < 5:
            t = Thread(target=call_batch, args=(command))
            t.daemon = True
            t.start()
            processing += 1
        else:
            time.sleep(0.1) # I don't know how long you expect these commands to take so this is allowing a max of 5 * (1/0.1) = 50 per second

如果您来自其他编程背景,您会发现缺少锁定。这是因为全局解释器锁定。

如果你对Python了解很多,你会注意到我建议使用shell=True。我推荐它,因为它在受信任的输入上执行时很简单而且没有危险,但是OP应根据场景决定是否使用shell=True

阅读Threadhttps://docs.python.org/2/library/threading.html#thread-objects
阅读subprocesshttps://docs.python.org/2/library/subprocess.html
有关shell=True is dangeroushttps://docs.python.org/2/library/subprocess.html#frequently-used-arguments

的原因的文档

如果您不需要对系统进行大量控制,则可以使用ThreadPool库中的multiprocessing。有关将multiprocessing.ThreadPool.map映射到多个线程的SelectNodes()示例,请参阅http://chriskiehl.com/article/parallelism-in-one-line/一半左右。