python asyncio传输异步方法与协同程序

时间:2015-09-07 10:05:45

标签: python-3.x python-asyncio

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

  

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

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

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

    谢谢。

1 个答案:

答案 0 :(得分:3)

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

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

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

所以

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

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

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

但是这些方法都是常规函数,所以如果没有yield from则调用它,如上例所示。