我是 asyncio
的新手,想知道在更好的实践、协议(protocol)或流方面,哪个 API 比另一个更好?
对我来说,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
与任何抽象一样,这是有代价的:协程的 react 性不如回调。例如 reader.read()
涉及至少两个事件循环回调:
- 当接收到一些数据时,会触发回调并调用
reader.feed_data
。 - 然后
feed_data
触发另一个恢复reader.read()
执行的回调。
关于python - 我应该在 asyncio 中使用协议(protocol)还是流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213409/