aiohttp Websocket 客户端和 HTTP 服务器
aiohttp Websocket client and HTTP server
我正在编写一个需要从两个源接收事件的应用程序。有些事件来自 Websocket 客户端连接,有些事件来自传入的 HTTP 请求。 aiohttp 是否可以在同一个应用程序中同时拥有这两个侦听器,或者我是否需要两个单独的可执行文件?
我目前有一个接受 websocket 事件并在每个事件上调用回调的函数
async def callback(msg):
print(msg)
async def websocket():
session = aiohttp.ClientSession()
async with session.ws_connect('http://example.org/websocket') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
await callback(msg.data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
break
问题是它会永远阻塞,所以我不知道如何将它与 aiohttp 服务器集成。如果我这样做:
await websocket()
aiohttp.web.run_app(app)
然后 web.run_app
永远不会被调用。有什么办法可以做到这一点?这似乎是 asyncio 的理想情况,多个事物异步处理多个事件。我该怎么做?
我能够通过使用我的 aiohttp 应用程序的 on_startup
处理程序来实现我的目标。
async def callback(msg):
print(msg)
async def websocket(session):
async with session.ws_connect('http://example.org/websocket') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
await callback(msg.data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
break
async def init(app):
session = aiohttp.ClientSession()
app['websocket_task'] = app.loop.create_task(websocket(session))
app = web.Application()
app.on_startup.append(init)
我正在编写一个需要从两个源接收事件的应用程序。有些事件来自 Websocket 客户端连接,有些事件来自传入的 HTTP 请求。 aiohttp 是否可以在同一个应用程序中同时拥有这两个侦听器,或者我是否需要两个单独的可执行文件?
我目前有一个接受 websocket 事件并在每个事件上调用回调的函数
async def callback(msg):
print(msg)
async def websocket():
session = aiohttp.ClientSession()
async with session.ws_connect('http://example.org/websocket') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
await callback(msg.data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
break
问题是它会永远阻塞,所以我不知道如何将它与 aiohttp 服务器集成。如果我这样做:
await websocket()
aiohttp.web.run_app(app)
然后 web.run_app
永远不会被调用。有什么办法可以做到这一点?这似乎是 asyncio 的理想情况,多个事物异步处理多个事件。我该怎么做?
我能够通过使用我的 aiohttp 应用程序的 on_startup
处理程序来实现我的目标。
async def callback(msg):
print(msg)
async def websocket(session):
async with session.ws_connect('http://example.org/websocket') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
await callback(msg.data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
break
async def init(app):
session = aiohttp.ClientSession()
app['websocket_task'] = app.loop.create_task(websocket(session))
app = web.Application()
app.on_startup.append(init)