Я запускаю цикл asyncio в приведенном ниже коде для получения данных с помощью веб-сокетов. Иногда сетевое соединение обрывается или сервер не отвечает, поэтому я ввел timeout
, который перехватывается обработчиком исключений. timeout
позволяет мне быстро остановить соединение, прежде чем я получу сообщение об ошибке соединения.
Однако, как только сетевое соединение будет восстановлено или сервер снова будет подключен к сети, я не знаю, как снова подключиться к серверу, чтобы я мог продолжать выполнять свой цикл, как раньше?
Я также получаю следующие ошибки ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
и websockets.exceptions.ConnectionClosedError: no close frame received or sent
.
import asyncio
import websockets
import json
from concurrent.futures import TimeoutError as ConnectionTimeoutError
async def call_dapi():
async with websockets.connect('wss://test.deribit.com/ws/api/v2') as websocket:
while True:
try:
msg = {"jsonrpc": "2.0", "method": "public/get_order_book", "id": 1, "params": {"instrument_name": "BTC-PERPETUAL"}, "depth": "5"}
await websocket.send(json.dumps(msg))
response = await asyncio.wait_for(websocket.recv(), timeout=2)
response = json.loads(response)
print(response)
await asyncio.sleep(1)
except ConnectionTimeoutError as e:
print('Error connecting.')
pass
asyncio.ensure_future(call_dapi())
asyncio.get_event_loop().run_forever()
@TimRoberts спасибо, но как мне это сделать? Не могли бы вы предоставить код, если это не слишком сложно?
Я полагаю, что могу, но это кажется довольно очевидным.
@TimRoberts спасибо. Раньше я не сталкивался с вложенными циклами. Спасибо, что указали мне правильное направление и представили что-то новое.
Я не пробовал это, но это философия.
import asyncio
import websockets
import json
from concurrent.futures import TimeoutError as ConnectionTimeoutError
async def call_dapi():
while True:
async with websockets.connect('wss://test.deribit.com/ws/api/v2') as websocket:
live = True
while live:
try:
msg = {"jsonrpc": "2.0", "method": "public/get_order_book", "id": 1, "params": {"instrument_name": "BTC-PERPETUAL"}, "depth": "5"}
await websocket.send(json.dumps(msg))
response = await asyncio.wait_for(websocket.recv(), timeout=2)
response = json.loads(response)
print(response)
await asyncio.sleep(1)
except ConnectionTimeoutError as e:
print('Error connecting.')
live = False
asyncio.ensure_future(call_dapi())
asyncio.get_event_loop().run_forever()
Вам нужно снова вернуться к вызову
websockets.connect
. Вам понадобится вторая петля.