其他分享
首页 > 其他分享> > 我应该在asyncio中使用协议还是流?

我应该在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