我应该在asyncio中使用协议还是流?

问题描述:

我对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 

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

Li在任何抽象中,这都是有代价的:协程比回调响应要少一些。例如reader.read()涉及至少两个事件循环回调:

  • 当接收到一些数据,回调被触发,reader.feed_data被调用。
  • 然后feed_data触发另一个回调,恢复执行reader.read()