#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
передается другому модулю, и вы теряете контроль над его жизненным циклом.