【问题标题】:python asyncio Transport asynchronous methods vs coroutinespython asyncio 传输异步方法与协程
【发布时间】:2015-12-02 20:27:59
【问题描述】:
我是 asyncio 的新手,我开始使用 Transports 创建一个简单的服务器-客户端程序。
在 asyncio 页面上,我看到以下内容:
Transport.close() 可以在 WriteTransport.write() 之后立即调用,即使数据尚未在套接字上发送:这两种方法都是异步的。不需要 yield from 因为这些传输方法不是协程。
我搜索了网络(包括 stackoverflow),但找不到以下问题的好答案:异步方法和协程之间的主要区别是什么?
我唯一能做出的两个区别是:
- 在协程中,您可以使用
yield from 表达式对主循环执行的方法的顺序进行更细粒度的控制。
- 协程是生成器,因此内存效率更高。
还有什么我遗漏的吗?
谢谢。
【问题讨论】:
标签:
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,如上例所示。