我是asyncio的新手,我开始与Transports合作创建一个简单的服务器 - 客户端程序。
在asyncio页面上,我看到以下内容:
可以在WriteTransport.write()之后立即调用Transport.close(),即使套接字上尚未发送数据:这两种方法都是异步的。不需要收益率因为这些运输方法不是协同程序。
我搜索了网页(包括stackoverflow),但无法找到以下问题的正确答案:异步方法和协程之间的主要区别是什么?
我能做的唯一两个不同之处是:
yield from
表达式对主循环执行的方法的顺序进行更细粒度的控制。我错过了什么?
谢谢。
答案 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
则调用它,如上例所示。