python - 我应该在 asyncio 中使用协议(protocol)还是流?

标签 python python-3.x coroutine python-asyncio

我是 asyncio 的新手,想知道在更好的实践、协议(protocol)或流方面,哪个 API 比另一个更好?

对我来说,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更高级别并提供许多有用的方法:

与任何抽象一样,这是有代价的:协程的 react 性不如回调。例如 reader.read() 涉及至少两个事件循环回调:

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

关于python - 我应该在 asyncio 中使用协议(protocol)还是流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213409/

相关文章:

python - 异步 : collecting results from an async function in an executor

python - 如何从 .t​​xt 文件中提取出现在某个关键字后面的某些数据

python - ipyvuetify FileInput Widget - 检索文件输入

python - 在 pandas 数据框中如何应用自己的函数多选择列并为该计算创建一个新列

python - Librosa 在 Docker 中引发了 OSError ('sndfile library not found' )

python - 循环遍历生成器的 Cythonizing for 循环

python - Pandas 没有用 NaN 正确重新索引

python - 适用于 Python 的 Twilio RequestValidator 始终返回 false

python - "executes"是一个 f-string 的内部函数的名称是什么?

node.js - Promise.coroutine 如何支持生成器作为可屈服值?