Python запускает несколько команд одновременно - PullRequest
0 голосов
/ 05 января 2011

До этого я запускаю две команды для цикла for, например для x в $ set: command. Чтобы сэкономить время, я хочу запустить эти две команды одновременно, как параллельный метод в makefile

Спасибо, Лин

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Модуль потоков не даст вам большой производительности из-за глобальной блокировки интерпретатора.

Я думаю, что лучший способ сделать это - использовать модуль 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, то вы знаете, что истекло время ожидания.

1 голос
/ 05 января 2011

twisted или select модуль, вероятно, то, что вы ищете.

Если все, что вы хотите сделать, это набор команд, командных сценариев, т.е.

#!/bin/sh
for i in "command1 command2 command3"; do
    $i &
done

Может работать лучше. С другой стороны, Makefile, как вы сказали.

0 голосов
/ 05 января 2011

Посмотрите на модуль threading .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...