如何在上下文管理器之外打开 websocket 连接?

Posted

技术标签:

【中文标题】如何在上下文管理器之外打开 websocket 连接?【英文标题】:How can I open a websocket connection outside of a context manager? 【发布时间】:2017-03-22 04:28:05 【问题描述】:

这是在this question 的回答中提出的,但我想专门问一个新人。

如何在不使用上下文管理器的情况下连接到 websocket?在实际调用需要使用它的协程时,我在关闭 websocket 时遇到了问题。

ws = websockets.connect('ws://192.168.1.32:8765')
print(ws)

给出<websockets.py35.client.Connect object at 0x0076CAD0>,而不是我使用上下文管理器得到的<websockets.client.WebSocketClientProtocol object at 0x04A91A70>Connect 对象没有 sendrecv 方法。

【问题讨论】:

【参考方案1】:

用途:

ws = await websockets.connect('ws://192.168.1.32:8765')

您可以查看Client 的源代码,了解它如何与异步上下文管理器配合使用:

async def __aenter__(self):
    self.websocket = await self
    return self.websocket

要关闭连接,请使用:

await ws.close()

请记住,上下文管理器通常会为您提供帮助:您可能希望更改代码以使用它们而不是绕过它们。

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。 @Udi 我会喜欢使用上下文管理器 - 但它总是在任何协程可以使用它之前关闭 websocket 连接 除非你等待 即便如此,很遗憾。 @udi 道歉 - 它现在正在工作!有一个问题因为其他原因而不起作用,但我(希望)现在已经解决了!如果我可以让它在一个单独的线程中工作,那么整个问题将得到解决!

以上是关于如何在上下文管理器之外打开 websocket 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 资源管理器中添加“在此处打开 git-bash ...”上下文菜单?

如何使用 websocket 安全地将我的 cli 应用程序连接到网站

如何使用 C 或 C++ 将选项添加到 Windows 资源管理器上下文菜单?

C#:如何打开选择了多个文件的 Windows 资源管理器窗口

如何使用 webdriver 作为上下文管理器

如何正确理解关键字"with"与上下文管理器(转载)