【问题标题】:python asyncio Transport asynchronous methods vs coroutinespython asyncio 传输异步方法与协程
【发布时间】:2015-12-02 20:27:59
【问题描述】:

我是 asyncio 的新手,我开始使用 Transports 创建一个简单的服务器-客户端程序。
在 asyncio 页面上,我看到以下内容:

Transport.close() 可以在 WriteTransport.write() 之后立即调用,即使数据尚未在套接字上发送:这两种方法都是异步的。不需要 yield from 因为这些传输方法不是协程。

我搜索了网络(包括 stackoverflow),但找不到以下问题的好答案:异步方法和协程之间的主要区别是什么?
我唯一能做出的两个区别是:

  1. 在协程中,您可以使用 yield from 表达式对主循环执行的方法的顺序进行更细粒度的控制。
  2. 协程是生成器,因此内存效率更高。

还有什么我遗漏的吗?

谢谢。

【问题讨论】:

    标签: python-3.x python-asyncio


    【解决方案1】:

    在上下文中 异步 意味着.write().close() 都是常规方法,而不是协程。

    如果.write() 不能立即写入数据,它会将数据存储在内部缓冲区中。

    .close() 从不立即关闭连接,而是在发送所有内部缓冲区后安排套接字关闭。

    所以

    transp.write(b'data')
    transp.write(b'another data')
    transp.close()
    

    是安全且完全正确的代码。

    .write().close() 显然也不是协程。 您应该通过 yield from 表达式调用协程,例如yield from coro().

    但是这些方法是约定的函数,所以调用它时不要yield from,如上例所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多