Несколько циклов событий на примере асинхронного сервера веб-сокетов - PullRequest
0 голосов
/ 25 апреля 2018

Мне трудно понять причину кода ниже, надеюсь, кто-то может пролить свет на это. Я новичок в асинхронном программировании.

Это из паутины документация

#!/usr/bin/env python

import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)

asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, 'localhost', 8765))
asyncio.get_event_loop().run_forever()

У меня есть несколько вопросов о дизайне asyncio и о том, как я могу этим воспользоваться.

Прежде всего, глядя на последние две строки. Если я правильно понимаю, не должно ли run_until_complete завершить работу после завершения своей работы? Как может второй цикл сохранить его без каких-либо заданий, переданных в цикл?

Во-вторых, я пытался создать back_end, который может обрабатывать некоторые данные из front_end с помощью веб-сокетов и возвращать вычисления в реальном времени. Будет два вида задач, одна из которых будет немного длиннее, для которой потребуется немного вычислительной мощности, но это будет происходить один раз для сеанса, и куча потоковых данных, которые необходимо немедленно отправить обратно (90 кадров в секунду).

Для более крупных задач, должен ли я просто запустить другой сервер веб-сокетов, который обрабатывает более длительную работу, и использовать основной веб-сокет для его использования? Или использовать другой процесс для выполнения работы в связанной асинхронной функции? А что касается небольших задач, что может пойти не так, если я сделаю то же, что и выше?

TLDR:

  1. Асинхронное программирование бьет меня по голове.
  2. Поддержка неблокирующего сеанса
  3. Какие процессы тяжелой работы и легкой работы одновременно
  4. Легкая работа должна иметь нулевую задержку
  5. Тяжелая работа должна быть максимально быстрой, но не должна влиять на работу света.

Спасибо !!

...