2017-12-07 33 views
1

2つのソースからイベントを取得する必要があるアプリケーションを作成しています。いくつかのイベントはWebsocketクライアント接続から来るものもあれば、入ってくるHTTPリクエストから来るものもあります。 aiohttpでこれらのリスナーを同じアプリケーションに使用することは可能ですか、または2つの別個の実行可能ファイルが必要ですか?aiohttp WebsocketクライアントとHTTPサーバー

私は現在のWebSocketイベントを取る機能があり、問題は永遠にこのブロックのことですので、私は私がaiohttpでこれを統合できるのか分からない

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 

各イベントにコールバックを呼び出しサーバ。私がする場合:

await websocket() 
aiohttp.web.run_app(app) 

web.run_appは決して呼ばれません。これを達成するための方法はありますか? asyncioの理想的なケースのように思えます。複数のイベントを非同期的に処理する複数のものです。どうすればいいのですか?

答えて

1

私の目標を達成するために、私の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) 
+0

標準的な解決策 –

関連する問題