我有一个包含所有批处理命令的列表。(超过1000个)计数 我需要一次从这个列表中运行5个命令(并行),如果任何一个完成,第6个应该启动。
你能帮忙吗?感谢答案 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
。
阅读Thread
:https://docs.python.org/2/library/threading.html#thread-objects
阅读subprocess
:https://docs.python.org/2/library/subprocess.html
有关shell=True is dangerous
:https://docs.python.org/2/library/subprocess.html#frequently-used-arguments
如果您不需要对系统进行大量控制,则可以使用ThreadPool
库中的multiprocessing
。有关将multiprocessing.ThreadPool.map
映射到多个线程的SelectNodes()
示例,请参阅http://chriskiehl.com/article/parallelism-in-one-line/一半左右。