2017-12-07 32 views
1

두 소스에서 이벤트를 받아야하는 응용 프로그램을 작성하고 있습니다. 일부 이벤트는 Websocket 클라이언트 연결에서 제공되며 일부 이벤트는 들어오는 HTTP 요청에서 가져옵니다. aiohttp를 사용하여 두 응용 프로그램 모두에서 동일한 리스너를 사용할 수 있습니까? 아니면 두 개의 별도 실행 파일이 필요합니까?aiohttp Websocket 클라이언트 및 HTTP 서버

I 현재 각 이벤트에 콜백을 웹 소켓 이벤트를 받아, 호출하는 기능을 가지고

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에 대한 이상적인 경우 인 것처럼 보입니다. 어떻게해야합니까?

답변

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

정식 솔루션 –