![](/img/trans.png)
[英]How to send data through a client websocket in a aiohttp request handler
[英]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
。 有什么辦法可以做到這一點? 似乎是異步的理想情況,多個事物異步處理多個事件。 我該怎么做?
通過使用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.