该文档提到 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/