【问题标题】:How can I open a websocket connection outside of a context manager?如何在上下文管理器之外打开 websocket 连接?
【发布时间】: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 方法。

【问题讨论】:

    标签: python websocket python-asyncio


    【解决方案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 道歉 - 它现在正在工作!有一个问题因为其他原因而不起作用,但我(希望)现在已经解决了!如果我可以让它在一个单独的线程中工作,那么整个问题将得到解决!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2022-11-22
    • 2021-12-31
    • 2013-07-04
    • 2018-03-09
    • 2010-10-10
    相关资源
    最近更新 更多