我应该在asyncio中使用协议还是流?
问题描述:
我对asyncio
非常陌生,想知道哪种API比其他API在更好的实践,协议或流方面更好?我应该在asyncio中使用协议还是流?
对我来说,protocol(callback based API)
似乎更容易合作,因为已经有connection_made
和data_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较高水平,提供了许多有用的方法:
- 几种方法来读取数据:reader.read, readline, readuntil, readexactly
- 检查EOF已经达到:reader.ateof
- 控制写入流程:writer.drain
Li在任何抽象中,这都是有代价的:协程比回调响应要少一些。例如reader.read()
涉及至少两个事件循环回调:
- 当接收到一些数据,回调被触发,
reader.feed_data
被调用。 - 然后
feed_data
触发另一个回调,恢复执行reader.read()
。