Я запускаю процесс на машине с 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 и заменяет предыдущее содержимое самым последним.Повторяйте, пока задание не завершится
Хотя проблема асинхронного ввода-вывода в подпроцессе все еще остается проблемой.