Ошибка при попытке подключения к слишком большому количеству веб-сокетов - PullRequest
0 голосов
/ 27 декабря 2018

, поэтому мой код пытается одновременно отправить 300 запросов GET и затем подключиться к 300 веб-сокетам.Он работает с 3+ веб-сокетами / GET-запросами, но как только он набирает большие числа, он выдает ошибку.Также запросы GET не выполняются асинхронно, и ошибка появляется только после того, как все они были отправлены.

Это ошибка:

[...] File "/ usr / local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py ", строка 748, в getaddrinfo для res в _socket.getaddrinfo (хост, порт, семейство, тип,proto, flags): socket.gaierror: [Errno 8] указано ни имя, ни имя сервера, либо неизвестно

Это код:

import websockets
import requests
import asyncio

async def get_order_book(symbol):
    r = requests.get(url='https://api.binance.com/api/v1/depth',
                     params={'symbol': symbol, 'limit': 20})
    r2 = requests.get(url='https://api.binance.com/api/v1/aggTrades',
                      params={'symbol': symbol, 'limit': 1})
    obdata = r.json()
    trdata = r2.json()

    print(symbol)

    ws_url = 'wss://stream.binance.com:9443/ws/' + lc_symbol + '@depth/' + lc_symbol + '@aggTrade'
    websocket = await websockets.connect(ws_url)

async def get_order_books():
    r = requests.get(url='https://api.binance.com/api/v1/ticker/24hr')
    await asyncio.gather(*[get_order_book(data['symbol']) for data in r.json()])

if __name__ == '__main__':
    asyncio.run(get_order_books())

Есть идеи, почему это происходит?

Спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Ваш код работает, как и ожидалось, без ошибок.Запросы выполняются синхронно, поэтому ваш код выполняется синхронно - get_order_book не прекращает управление до тех пор, пока не ожидают веб-сокеты.

Если вы хотите выполнить асинхронные запросы, посмотрите этот ответ:

https://stackoverflow.com/a/22414756/10840818

Чтобы использовать запросы (или любые другие блокирующие библиотеки) с asyncio, вы можете использовать BaseEventLoop.run_in_executor для запуска функции в другом потоке и выдачи из нее для получения результата.

...