2016-07-05 62 views
3

我對asyncio非常陌生,想知道哪種API比其他API在更好的實踐,協議或流方面更好?我應該在asyncio中使用協議還是流?

對我來說,protocol(callback based API)似乎更容易合作,因爲已經有connection_madedata_received方法提供給您。與streams(coroutine based API)你必須自己管理連接和讀取數據,但我覺得它更多地利用了coroutine的概念,這對我來說似乎是件好事。

這就是我如何聽取傳入的數據,對我感到尷尬。我也可以使用readeexactly,但有時會增加IncompleteReadError

message_body = b'' 
message_length = SOME_NUMBER 
while True: 
    while len(message_body) < message_length: 
     try: 
      message_body_chunk = await reader.read(message_length - len(message_body)) 
     except Exception as e: 
      self.logger.error(e) 
      return 
      if not message_body_chunk: 
       return 
      message_body += message_body_chunk 

回答

3

stream objects較高水平,提供了許多有用的方法:

Li在任何抽象中,這都是有代價的:協程比回調響應要少一些。例如reader.read()涉及至少兩個事件循環回調:

  • 當接收到一些數據,回調被觸發,reader.feed_data被調用。
  • 然後feed_data觸發另一個回調,恢復執行reader.read()