Python3 и asyncio: как реализовать сервер websocket в качестве экземпляра asyncio? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть несколько серверов, каждый сервер возвращается экземпляром asyncio.start_server.Мне нужен мой web_server для работы с веб-сокетами, чтобы иметь возможность получать данные с помощью моего клиента javascript.Как я вижу, asyncio не предоставляет веб-сокеты, только TCP-сокеты.Может я что то пропустил?Я хочу реализовать сервер websocket, который я могу использовать в asyncio.gather, как показано ниже:

    loop = asyncio.get_event_loop()

    login_server = LoginServer.create()
    world_server = WorldServer.create()
    web_server   = WebServer.create()

    loop.run_until_complete(
        asyncio.gather(
            login_server.get_instance(),
            world_server.get_instance(),
            web_server.get_instance()
        )
    )

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass

    loop.close()

Я не хочу использовать причину aiohttp, если использование как в коде выше aiohttp просто блокирует другие задачи.Мне нужно что-то, что будет неблокирующим и будет иметь доступ к данным других серверов (логин и мир).Возможно ли это с помощью asyncio?Предоставляет ли asyncio что-то вроде веб-сокетов?Как реализовать сервер websocket для использования в asyncio.gather?

1 Ответ

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

Ну, наконец-то я реализовал WebServer для использования в другом потоке с asyncio.Код (код WebServer):

from aiohttp import web


class WebServer(BaseServer):

    def __init__(self, host, port):
        super().__init__(host, port)

    @staticmethod
    async def handle_connection(self, request: web.web_request):
        ws = web.WebSocketResponse()
        await ws.prepare(request)

        async for msg in ws:
            Logger.debug('[Web Server]: {}'.format(msg))

        return ws

    @staticmethod
    def run():
        app = web.Application()
        web.run_app(app, host=Connection.WEB_SERVER_HOST.value, port=Connection.WEB_SERVER_PORT.value)

И как запустить:

executor = ProcessPoolExecutor()

loop.run_until_complete(
    asyncio.gather(
        login_server.get_instance(),
        world_server.get_instance(),
        loop.run_in_executor(executor, WebServer.run)
    )
)
...