как подключиться к WebSocket без диспетчера контекста?

#python #websocket

#python #websocket

Вопрос:

Я хочу работать с пакетом WebSockets, в котором в документации указано, что я могу подключиться к WebSocket следующим образом :

     async with WebSockets.connect(URI) as WebSocket:
          greeting = await WebSocket.recv()
 

но я хочу подключиться без диспетчера контекста, но я получил ошибку :

 ws = websockets.connect(uri)
msg = ws.recv()
 

вот ошибка :

 AttributeError: 'Connect' object has no attribute 'recv'
 

Можете ли вы мне помочь?

Комментарии:

1. Почему вы хотите подключиться без диспетчера контекста?

2. @AntoinePinsard потому что я хочу сохранить соединение как переменную, потому что мне нужно иметь контроль над WebSocket вне context manager, как было. закрыть ()

3. Вы должны иметь возможность поместить весь свой код внутрь with , используя функции, если это необходимо для более чистого кода. Если вы используете context manager, вам не нужно закрывать websocket самостоятельно, это назначение context manager.

Ответ №1:

Отказ от использования диспетчера контекста не освобождает вас от использования async / await .

 ws = await websockets.connect(uri)
try:
    msg = await ws.recv()
finally:   # If you don't use context manager, you have to close the connection manually
    await ws.ws_client.close()
 

Но я не вижу причин не использовать диспетчер контекста. Если вы удалите его, вам все равно придется заменить его на try / finally .

Комментарии:

1. Спасибо за это, я допустил ту же ошибку, что и OP, а именно, не await ввел вызов websockets.connect

2. Спасибо, что указали ws.close() . Без этого цикл событий никогда не закончится. Для необходимости избегать context manager существуют сценарии, в которых ему требуется пул соединений; есть также сценарии, в которых ws передается другому модулю, и вы теряете контроль над его жизненным циклом.