Python3和asyncio:如何将websocket服务器实现为asyncio实例?

问题描述 投票:1回答:1

我有多个服务器,每个服务器都是由asyncio.start_server返回的实例。我需要我的web_server与websockets一起工作,有可能使用我的javascript客户端获取数据。我可以看到,asyncio不提供websockets,只提供tcp套接字。也许我错过了什么?我想实现我可以在asyncio.gather中使用的websocket服务器,如下所示:

    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是否提供像websockets这样的东西?如何实现websocket服务器在asyncio.gather中使用?

python python-3.x websocket python-3.5 python-asyncio
1个回答
1
投票

好吧,最后我实现了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)
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.