Python3 和 asyncio:如何将 websocket 服务器实现为 asyncio 实例?
Python3 and asyncio: how to implement websocket server as asyncio instance?
我有多个服务器,每个服务器都是 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,因为如果在上面的代码中使用 like aiohttp 只会阻止其他任务。我需要一些非阻塞的东西,并且可以访问其他服务器(登录和世界)的数据。 asyncio 有可能吗? asyncio 是否提供类似 websockets 的东西?如何实现在 asyncio.gather 中使用的 websocket 服务器?
好吧,我终于实现了 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)
)
)
我有多个服务器,每个服务器都是 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,因为如果在上面的代码中使用 like aiohttp 只会阻止其他任务。我需要一些非阻塞的东西,并且可以访问其他服务器(登录和世界)的数据。 asyncio 有可能吗? asyncio 是否提供类似 websockets 的东西?如何实现在 asyncio.gather 中使用的 websocket 服务器?
好吧,我终于实现了 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)
)
)