Запуск фонового задания для веб-сокетов в Python - PullRequest
0 голосов
/ 18 февраля 2019

Я запустил проект, который требует и использует веб-сокеты для отправки информации с сервера X на клиент Y, как и предполагалось.

Однако я продолжал сталкиваться с проблемой, когда каждые 20 с или около того соединение будетбыть отброшенным, поскольку именно таков должен быть TCP / IP, поэтому мне нужно отправить сердцебиения как таковые.

Прежде чем я продолжу, есть ли другой способ сделать это (кромеотправьте сердцебиение), пожалуйста, дайте мне знать.


Итак, методология, которую я собирался сделать в паутину перед отправкой сердцебиения, была такой:

async def listener(websocket, path, service):
  command = service['log_command']
  p = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1, shell=True)
  prev_sd = "-1"
  await heartbeat_manager(websocket)
  asyncio.sleep(5)
  while True:
    await websocket.send(p.stdout.readline())

while True иПосле того, как все, что нас волнует, я намерен сделать так, чтобы веб-сокет отправлял сердцебиение некоторого текста каждые 5 секунд, но не знаю, с чего вообще начинать.

Sidenote: есть еще одна функция, которую я вызываюэто на самом деле запускает эту веб-розетку, но это не имеет отношения к вопросу, поэтому я не включил его, но будьте уверены;он существует (и весь этот код функционален, но только за 20 секунд до смерти).

1 Ответ

0 голосов
/ 18 февраля 2019

Поскольку вы используете механизм Python async / await, возможно, вы можете попробовать использовать подпроцессы asyncio , чтобы позволить вам ожидать выходных потоков подпроцесса.Следующий пример кода порождает подпроцесс и проверяет наличие новых строк, доступных на стандартном выходе, с 5-секундным таймаутом, используя asyncio.wait_for();если данные для отправки недоступны, вместо этого мы отправляем сердцебиение.

import asyncio

async def listener(websocket, path, service):
    command = service['log_command']
    p = await asyncio.create_subprocess_shell(command, stdout=asyncio.subprocess.PIPE)
    ...
    while True:
        try:
            data = await asyncio.wait_for(p.stdout.readline(), timeout=5)
            websocket.send(data)
        except asyncio.TimeOutError:
            await websocket.send("heartbeat")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...