簡體   English   中英

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 有什么辦法可以做到這一點? 似乎是異步的理想情況,多個事物異步處理多個事件。 我該怎么做?

通過使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM