Модуль потоков не даст вам большой производительности из-за глобальной блокировки интерпретатора.
Я думаю, что лучший способ сделать это - использовать модуль subprocess
и открывать каждую команду своим собственным стандартным выводом.
processes = {}
for cmd in ['cmd1', 'cmd2', 'cmd3']:
p = subprocess.Popen('cmd1', stdout=subprocess.PIPE)
processes[p.stdout] = p
while len(processes):
rfds, _, _ = select.select(processes.keys(), [], [])
for fd in rfds:
process = processses[fd]
print fd.read()
if process.returncode is not None:
print "Process {0} returned with code {1}".format(process.pid, process.returncode)
del processes[fd]
В основном вы должны использовать select, чтобы увидеть, какие файловые дескрипторы готовы, и вы должны проверить их код возврата, чтобы убедиться, что «чтение» вызвало их выход. Процессы в основном переходят в состояние ожидания, пока их стандартный вывод не будет закрыт. Если вы хотите сделать что-то во время ожидания, вы можете установить тайм-аут на select.select (), чтобы вы перестали ждать через столько времени. Вы можете проверить длину rfds, и если она равна 0, то вы знаете, что истекло время ожидания.