Вот моя проблема, которая частично решена, но, думаю, не лучшим образом. У меня есть REST API-сервер, который имеет метод POST, который выполняет только пакетный процесс. Метод немедленно возвращает 200 (без какого-либо тела), и пакетный процесс продолжает свою задачу на сервере. У этого пакетного процесса есть файл журнала, который я обычно вижу онлайн с tail -f mylogfile.log
. Теперь я хочу использовать сервер веб-сокетов для отправки вывода хвостового процесса на веб-страницу. Код сервера веб-сокетов выглядит следующим образом:
import os
import asyncio
import websockets
import subprocess
from frontserv.start_server import WEBSOCKET_INTERCHANGE_FILE
async def main(websocket, path):
print("-> STARTING")
exists = os.path.isfile(WEBSOCKET_INTERCHANGE_FILE)
if not exists:
f = open(WEBSOCKET_INTERCHANGE_FILE, "w+")
f.close()
exe = ["tail", "-f", WEBSOCKET_INTERCHANGE_FILE]
message = ""
p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=None)
while True:
retcode = p.poll()
print(message)
message = message + p.stdout.readline().decode("utf-8") + "<br>"
await websocket.send(message)
await asyncio.sleep(0.1)
start_server = websockets.serve(main, '127.0.0.1', 5678)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
У меня есть доступ к коду пакетного процесса, и я думаю, что есть лучший способ решить эту проблему. Если бы вместо того, чтобы войти в файл, я мог бы отправить сообщение на сервер веб-сокетов, чтобы отправить сообщение в браузер, я думаю, что это было бы лучшей реализацией.
С наилучшими пожеланиями!