尝试连接太多WebSocket时出错

时间:2018-12-27 09:13:53

标签: python websocket request async-await python-asyncio

所以我的代码尝试同时发送300个GET请求,然后连接到300个WebSocket。它可以处理3个以上的websockets / GET请求,但是一旦获得高数值,它就会输出一个错误。同样,GET请求也不是异步完成的,只有在全部发送完之后,错误才会出现。

这是错误:

[...] getaddrinfo中的文件“ /usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py”,第748行     用于_socket.getaddrinfo中的res(主机,端口,家庭,类型,原型,标志): 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 :(得分:1)

您的代码可以正常工作,没有错误。请求是同步的,这就是代码同步运行的原因-get_order_book在websockets等待之前不会放弃控制。

如果您想要异步请求,请参见以下答案:

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

  

要将请求(或任何其他阻止库)与asyncio一起使用,可以使用BaseEventLoop.run_in_executor在另一个线程中运行一个函数,并从该线程中屈服以获得结果。