2012-05-25 2 views
0

Мне нужно вызвать службу python (я использую бутылку и gunicorn), которая запускает команду dd (http req 1), а также мне нужно способный в любой момент прекратить процесс с помощью другого вызова (http req 2).нужен подпроцесс python, чтобы сохранить http req открытым, но не блокировать другие http-запросы

А) ЕСЛИ я сделать что-то вроде:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out = p.stdout.read().strip() 

HTTP-REQ 2 ждет, пока HTTP REQ 1 заканчивается (так чтение вывода блокирует одновременных вызовов)

B) Если я пишу вывод в файл, http req 1 не блокирует другие запросы, но этот запрос заканчивается, между тем команда выполняется в фоновом режиме.

Итак, мне нужно, чтобы поддерживать http-req 1 до завершения команды, но в то же время мне нужно иметь возможность завершить процесс другим запросом. (Если я использую простой time.sleep (х) вместо того, чтобы читать выходные я получаю то, что хочу, то REQ 1 сохраняет живой, и я могу назвать REQ 2 одновременно)

Пожалуйста, помогите

ответ

1

Вы можете попытаться использовать http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout + select.select([p.stdout.fileno()], [], [], timeout), но самым простым способом является использование http://docs.python.org/library/subprocess.html#subprocess.Popen.poll, чтобы проверить завершение процесса и чтение вывода только при завершении подпроцесса.

while p.pool() is None: # supprocess alive 
    time.sleep(timeout) 
out = p.stdout.read() 
+0

Это работает отлично! большое спасибо – Leandro