2017-05-08 50 views
0

我試圖發送多個消息到websocket服務器異步。 代碼我使用(簡稱爲清楚起見):aiohttp ws_response協同程序

class Bitfinex(object): 

    def __init__(self, session): 
     self.ws_conn = session.ws_connect(self.WS_URL) 

    async def subscribe(self): 
     tasks = [ 
      self.ws_conn.send_json(self.SUB_MESG.update({'prec': self.PREC_MAP[pair], 'pair': pair})) 
      for pair in self.PAIRS 
     ] 
     await asyncio.wait(tasks) 
     res = self.ws_conn.receive() 
     self.logger.debug('Subscribe result: {}'.format(res.data)) 

驅動腳本:

from bitfinex import Bitfinex 


async def main(): 

    session = aiohttp.ClientSession() 

    try: 
     # Duplicate objects just for testing purposes 
     collectors = [ 
      Bitfinex(session), 
      Bitfinex(session) 
     ] 

     # Subscribe to orderbook channels. 
     subscriptions = [ 
      col.subscribe() 
      for col in collectors 
     ] 
     await asyncio.wait(subscriptions) 

    finally: 
     session.close() 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 

ws_conn對象的正確初始化,應根據aiohttp文檔async with session.ws_connect(ws_url) as ws_conn:。該聲明返回ws_conn作爲ClientWebSocketResponse對象。我試圖初始化ws_conn沒有上下文管理器,並得到_WSRequestContextManager類型,而沒有send_json()方法。如何在沒有上下文管理器的情況下獲得適當的對象,並且不需要直接初始化?

回答

0

ws_connect是協同程序,所以你需要等待它的結果

self.ws_conn = await session.ws_connect(self.WS_URL) 

,但你不能使用等待協程外的表達,所以你需要把它從__init__方法移動