Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试连接到过多WebSocket时出错_Python_Websocket_Request_Async Await_Python Asyncio - Fatal编程技术网

Python 尝试连接到过多WebSocket时出错

Python 尝试连接到过多WebSocket时出错,python,websocket,request,async-await,python-asyncio,Python,Websocket,Request,Async Await,Python Asyncio,因此,我的代码尝试同时发送300个GET请求,然后连接到300个WebSocket。它可以处理3+个websockets/GET请求,但一旦进入高位,就会输出一个错误。此外,GET请求不是异步完成的,只有在它们全部发送后才会出现错误 这就是错误: [……] 文件“/usr/local/ceral/python/3.7.1/Frameworks/python.framework/Versions/3.7/lib/python3.7/socket.py”,第748行,位于getaddrinfo中 对

因此,我的代码尝试同时发送300个GET请求,然后连接到300个WebSocket。它可以处理3+个websockets/GET请求,但一旦进入高位,就会输出一个错误。此外,GET请求不是异步完成的,只有在它们全部发送后才会出现错误

这就是错误:

[……] 文件“/usr/local/ceral/python/3.7.1/Frameworks/python.framework/Versions/3.7/lib/python3.7/socket.py”,第748行,位于getaddrinfo中 对于_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())
知道为什么会这样吗


谢谢

您的代码对我来说可以正常工作,没有错误。请求是同步的,这就是为什么代码是同步运行的——在WebSocket等待之前,get_order_book不会放弃控制权

如果需要异步请求,请参阅以下答案:

要将请求(或任何其他阻塞库)与asyncio一起使用,可以使用BaseEventLoop.run_in_executor在另一个线程中运行函数,并从中产生结果


似乎是因为身处一个互联网连通性较低的特定国家而导致了这个问题。谢谢你的帮助!