Хвост файла в очередь сообщений - PullRequest
2 голосов
/ 20 апреля 2011

Я запускаю процесс на машине с Linux через подпроцесс python (особенно в AWS EC2), который генерирует несколько файлов.Мне нужно "хвост -f" этих файлов и отправить каждый из полученных jsonified выходных данных в соответствующие очереди AWS SQS.Как мне поступить с такой задачей?

Редактировать

Как следует из этого ответа, asyncproc и PEP3145 Я могу сделать это следующим образом:

from asyncproc import Process
import Queue
import os
import time

# Substitute AWS SQS for Queue
sta_queue = Queue.Queue()
msg_queue = Queue.Queue()
running_procs = {'status':(Process(['/usr/bin/tail', '--retry', '-f','test.sta']),sta_queue),'message':(Process(['/usr/bin/tail', '--retry', '-f', 'test.msg' ]),msg_queue)}

def handle_proc(p,q):
    latest = p.read()
    if latest:
        # If nothing new, latest will be an empty string
        q.put(latest)
    retcode = p.wait(flags=os.WNOHANG)
    return retcode

while len(running_procs):
    proc_names = running_procs.keys()
    for proc_name in proc_names:
        proc, q = running_procs[proc_name]
        retcode = handle_proc(proc, q)
        if retcode is not None: # Process finished.
            del running_procs[proc_name]
    time.sleep(1.0)
print("Status queue")
while not sta_queue.empty():
    print(sta_queue.get())
print("Message queue")
while not msg_queue.empty():
    print(msg_queue.get())

Этого должно быть достаточно, я думаю, если другие не могут дать лучший ответ.

Дополнительные правки

Я переосмысливаю проблему.Хотя вышеприведенное работает хорошо, я думаю, что самое простое решение: -проверьте наличие файлов. -Если файлы существуют, скопируйте их в корзину на AWS S3 и отправьте через AWS SQS сообщение о том, что файлы были скопированы.Повторяйте каждые 60 секунд - приложение-потребитель опрашивает SQS и в итоге получает сообщение о том, что файлы были скопированы - приложение-потребитель загружает файлы с S3 и заменяет предыдущее содержимое самым последним.Повторяйте, пока задание не завершится

Хотя проблема асинхронного ввода-вывода в подпроцессе все еще остается проблемой.

1 Ответ

0 голосов
/ 20 апреля 2011

Вы можете использовать подпроцесс . Открыть класс для запуска tail и чтения его вывода.

try:
    process = subprocess.Popen(['tail', '-f', filename], stdout=PIPE)
except (OSError, ValueError):
    pass    # TODO: handle errors
output = process.stdout.read()

Функция subprocess.check_output обеспечивает эту функциональность в одну строку. Это новое в Python версии 2.7.

try:
    output = subprocess.check_output(['tail', '-f', filename], stdout=PIPE)
except CalledProcessError:
    pass    # TODO: handle errors

Информацию о неблокирующем вводе-выводе см. в этом вопросе .

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