Не удается продолжить программу, если произошла ошибка api (соединения) binance - PullRequest
0 голосов
/ 10 июня 2019

Я получаю данные OHLCV из Binance через API Binance на AWS-EC2. Но иногда (раз в пару дней) возникает ошибка "104, 'ECONNRESET'" и программа останавливается.

Программа, написанная на Python3.7.3 и работающая на AWS-EC2

Код следующий. Но этот код не может продолжаться.

Я хочу продолжить выполнение программы при возникновении любой ошибки API или соединения.

Как мне справиться с этой ошибкой?

while True:

    ..............

    try :
        klines = client.get_historical_klines(ticker_symbol, Client.KLINE_INTERVAL_1MINUTE, _from_str, _until_str)

    except BinanceAPIException as e:
        print(e)
        print('Something went wrong. Error occured at %s. Wait for 1 hour.' % (datetime.datetime.now().astimezone(timezone('UTC'))))
        sleep(3600)
        continue

    ..............

Все сообщения об ошибках следующие.

Traceback (последний вызов был последним): файл "/Home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", линия 600, в урлопене chunked = chunked) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", строка 384, в _make_request Файл six.raise_from (e, None) "", строка 2, в файле повышение_файлов "/Home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", строка 380, в _make_request httplib_response = conn.getresponse () Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 1321, в ответе Файл response.begin () "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 296, в начале версия, статус, причина = файл self._read_status () "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 257, в _read_status line = str (файл self.fp.readline (_MAXLINE + 1), "iso-8859-1") "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/socket.py ", линия 589, в readinto вернуть файл self._sock.recv_into (b) "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py", строка 312, в recv_into вернуть файл self.recv_into (* args, ** kwargs) "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py", строка 302, в recv_into поднять SocketError (str (e)) OSError: (104, 'ECONNRESET')

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): File "/Home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/adapters.py", строка 449, отправка timeout = файл тайм-аута "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", строка 638, в урлопене _stacktrace = sys.exc_info () [2]) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/util/retry.py", строка 368, в приращении поднять файл six.reraise (тип (ошибка), ошибка, _stacktrace) "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/packages/six.py" , линия 685, в ререйзе поднять value.with_traceback (tb) файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", линия 600, в урлопене chunked = chunked) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", строка 384, в _make_request Файл six.raise_from (e, None) "", строка 2, в файле повышение_файлов "/Home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", строка 380, в _make_request httplib_response = conn.getresponse () Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 1321, в ответе Файл response.begin () "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 296, в начале версия, статус, причина = файл self._read_status () "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py", строка 257, в _read_status line = str (файл self.fp.readline (_MAXLINE + 1), "iso-8859-1") "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/socket.py ", линия 589, в readintoвернуть файл self._sock.recv_into (b) «/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py», строка 312, вrecv_into возвращает файл self.recv_into (* args, ** kwargs) "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py",строка 302, в recv_into вызывает SocketError (str (e)) urllib3.exceptions.ProtocolError: ('Соединение прервано.', OSError ("(104, 'ECONNRESET')"))

во время обработкииз вышеупомянутого исключения произошло другое исключение:

Traceback (последний последний вызов): файл "BTC_USDT_BINANCE_minutes.py", строка 54, в klines = client.get_historical_klines (ticker_symbol, Client.KLINE_INTERVAL_1MINUTst, _from, _until_str) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", строка 765, в get_historical_klines first_valid_ts = self._get_earliest_valid_timestamp (символ, интервал) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance / client.py ", строка 723, в _get_earliest_valid_timestamp endTime = Нет файла" /home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py ",строка 705, в get_klines возвращает self._get ('klines', data = params) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py ", строка 207, в _get возвращает файл self._request_api ('get', путь, подпись, версия, ** kwargs)" /home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py ", строка 181, в _request_api возвращает файл self._request (метод, uri, подписанный, ** kwargs) Файл" /home/ec2-user/.pyenv/versions/3.7.3/lib / python3.7 / site-packages / binance / client.py ", строка 175, в _request response = getattr (self.session, method) (uri, ** kwargs) Файл" /home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/sessions.py ", строка 546, в файле get return self.request (файл 'GET', url, ** kwargs)" / home / ec2-user / .pyenv / версии / 3.7.3 / lib / python3.7 / site-пакеты / запросы / sessions.py ", строка 533, яn request resp = self.send (prep, ** send_kwargs) Файл "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/sessions.py", строка646, в файле send r = adapter.send (запрос, ** kwargs) "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/adapters.py", строка 498, при отправке поднять ConnectionError (err, request = request) request.exceptions.ConnectionError: ('Соединение прервано.', OSError ("(104, 'ECONNRESET')"))

1 Ответ

0 голосов
/ 12 июня 2019

Предполагая, что вы используете модуль python-binance, скорее всего ошибка возникает из-за того, что вы пытаетесь повторно использовать client после долгого времени (тайм-аут сервера). Вы можете попытаться воссоздать client сначала:

...
client = Client(api_key, api_secret)
while True:
    ...
    try :
        klines = client.get_historical_klines(ticker_symbol, Client.KLINE_INTERVAL_1MINUTE, _from_str, _until_str)

    except BinanceAPIException as e:
        print(e)
        print('Something went wrong. Error occured at %s. Wait for 1 hour.' % (datetime.datetime.now().astimezone(timezone('UTC'))))
        sleep(3600)
        client = Client(api_key, api_secret)
        continue
...

Причина в том, что [Client][2] использует requests Session , что подразумевает использование пула соединений urllib3. Этот пул соединений нельзя использовать повторно после истечения времени ожидания.

...