我应该在asyncio中使用协议还是流?
作者:互联网
我对asyncio刚起步,想知道哪种API在更好的实践,协议或流方面比其他API更好?
对我来说,协议(基于回调的API)似乎更易于使用,因为已经提供了connection_made和data_received方法.使用流(基于协程的API),您必须自己管理连接和读取数据,但是我觉得它更多地利用了协程的概念,这对我来说似乎是一件好事.
这就是我收听传入数据的方式,让我感到尴尬.我也可以使用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
像任何抽象一样,这要付出一定的代价:协程的响应性比回调要差一些.例如reader.read()至少涉及两个事件循环回调:
>接收到某些数据时,将触发回调并调用reader.feed_data.
>然后feed_data触发另一个回调,以恢复reader.read()的执行.
标签:python-3-x,coroutine,python-asyncio,python 来源: https://codeday.me/bug/20191026/1940063.html