所以我的代码尝试同时发送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())
知道为什么会这样吗?
谢谢!
答案 0 :(得分:1)
您的代码可以正常工作,没有错误。请求是同步的,这就是代码同步运行的原因-get_order_book在websockets等待之前不会放弃控制。
如果您想要异步请求,请参见以下答案:
https://stackoverflow.com/a/22414756/10840818
要将请求(或任何其他阻止库)与asyncio一起使用,可以使用BaseEventLoop.run_in_executor在另一个线程中运行一个函数,并从该线程中屈服以获得结果。