Twisted Server получает поток данных через POST, читает request.content.read () побайтово с задержкой более часа - PullRequest
0 голосов
/ 28 октября 2019

Я собираюсь получить двоичный поток данных через вызов HTTP POST.

Я полагаю, что клиентская сторона работает, то есть записывает куски байтов на сервер, я вижуобъем данных, отправляемых с помощью tcpdump, однако файлоподобный объект Twisted request.content начинает выводить данные только после отключения клиента.

Вот как выглядит обработчик сервера:

def render(self, request):
  if request.path == '/incoming-stream':
    d = deferLater(reactor, 0, lambda: request)
    d.addCallback(self.async_read)
    return NOT_DONE_YET
def async_read(self, request):
  sys.stdout.write('\nasync_read ' + str(request) + '\n')
  sys.stdout.flush()
  while True:
    byte = request.content.read(1) # <--- read one byte
    if len(byte) > 0:
      sys.stdout.write(repr(byte))
      sys.stdout.flush()
    else:
      break
  sys.stdout.write('\nfinished ' + str(request) + '\n')
  sys.stdout.flush()
  request.write(b"finished")
  request.finish()

Если я не могу сделать это с POST, у меня нет проблем с переключением на WebSocket, но сначала я хотел бы попытаться сделать это с помощью POST. Отправленные данные являются долгосрочными (один новый запрос POST каждый час, когда он активен и получает данные в течение часа), данные датчиков с относительно высокой пропускной способностью составляют приблизительно 1 кбит / с.

Я знаю, что существуют более эффективные методыпередача данных (WebSocket, MQTT, AMQP), но POST и WebSocket доставят мне наименьшее количество проблем при получении данных через конечную точку SSL NGINX. В настоящее время NGINX не используется (чтобы отменить любую буферизацию, которую он может вызвать).

1 Ответ

1 голос
/ 28 октября 2019

Twisted Web не поддерживает потоковую загрузку в своей IResource абстракции.

См. https://twistedmatrix.com/trac/ticket/288

...