python-3.x - Python asyncio 模块中的 create_connection() 方法

标签 python-3.x python-asyncio

该文档提到 AbstractEventLoop.create_connection 在成功执行时将返回一个 (transport, protocol) 元组。然而all the examples显示它返回协程。

code还表明它确实返回(传输,协议(protocol))元组。你能帮忙解决这个问题吗?

最佳答案

两个观察结果都是正确的:create_connection是一个返回传输协议(protocol)对的协程函数。但要获取该返回值,您需要await协程(如果在async def中)或使用loop.run_until_complete(如果在同步代码中)。

如果你只是调用一个协程函数而不等待结果,那么你得到的是一个协程对象,你可以传递它并稍后等待。这类似于调用生成器函数仅返回生成器迭代器;要真正从中获取值,您必须使用 for 循环耗尽它。

许多示例并不真正需要返回值,因此它们仅将返回的协程对象存储在局部变量 coro 中,然后有效地运行 run_until_complete(coro)丢弃返回的传输/协议(protocol)对。完整的用法如 19.5.4.3.5 所示。 :

connect_coro = loop.create_connection(MyProtocol, sock=rsock)
transport, protocol = loop.run_until_complete(connect_coro)

我相信,如果这个例子和其他例子按照以下方式表述,那么很多困惑就会消失:

transport, protocol = loop.run_until_complete(
    loop.create_connection(MyProtocol, sock=rsock))

这更清楚地表明 create_connection 返回一对,并且您需要 run_until_complete (相当于 await 的同步)来访问它,后者是每个协程或 asyncio future 的情况。

关于python-3.x - Python asyncio 模块中的 create_connection() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340341/

相关文章:

python - 用重复值填充 nan

python-3.x - Python单元测试嵌套 "async with",如何模拟/修补?

python - 如果有正向前瞻和正向后向但没有定界符,我该如何拆分字符串?

python 3 : Write newlines to HTML

async-await - asyncio 中的同步生成器

python - Asyncio 与 Gevent

python - 使用队列的 Asyncio 持久客户端协议(protocol)类

python - 为什么在不同线程中调用 asyncio subprocess.communicate 会挂起?

python-3.x - 升级 ansible 以在 Controller 上使用 python3

python - 如何在 Python Django 中从表单实例创建表单集