Python 3.x Python websocket定期关闭
我从互联网上获得了这段代码,但很快websocket就关闭了,我不知道为什么。 似乎没有正确调用_reconnect函数,但由于我不擅长websocket与异步相结合,我不知道Python 3.x Python websocket定期关闭,python-3.x,asynchronous,websocket,Python 3.x,Asynchronous,Websocket,我从互联网上获得了这段代码,但很快websocket就关闭了,我不知道为什么。 似乎没有正确调用_reconnect函数,但由于我不擅长websocket与异步相结合,我不知道 class ReconnectingWebsocket: STREAM_URL = url MAX_RECONNECTS = 5 MAX_RECONNECT_SECONDS = 60 MIN_RECONNECT_WAIT = 0.1 TIMEOUT = 10 def _
class ReconnectingWebsocket:
STREAM_URL = url
MAX_RECONNECTS = 5
MAX_RECONNECT_SECONDS = 60
MIN_RECONNECT_WAIT = 0.1
TIMEOUT = 10
def __init__(self, loop, path, coro, socket_type='spot', prefix='ws/'):
self._loop = loop
self._log = logging.getLogger(__name__)
self._path = path
self._coro = coro
self._prefix = prefix
self._reconnects = 0
self._conn = None
self._socket = None
self._connect()
def _connect(self):
self._conn = asyncio.ensure_future(self._run(), loop=self._loop)
async def _run(self):
ws_url = self.STREAM_URL + self._prefix + self._path
async with ws.connect(ws_url) as socket:
self._socket = socket
self._reconnects = 0
try:
while True:
try:
evt = await asyncio.wait_for(self._socket.recv(), timeout=self.TIMEOUT)
except asyncio.TimeoutError:
await self.send_ping()
except asyncio.CancelledError:
await self.send_ping()
else:
try:
evt_obj = json.loads(evt)
except ValueError:
pass
else:
await self._coro(evt_obj)
except ws.ConnectionClosed as e:
await self._reconnect()
except Exception as e:
await self._reconnect()
def _get_reconnect_wait(self, attempts: int) -> int:
expo = 2 ** attempts
return round(random() * min(self.MAX_RECONNECT_SECONDS, expo - 1) + 1)
async def _reconnect(self):
await self.cancel()
self._reconnects += 1
if self._reconnects < self.MAX_RECONNECTS:
reconnect_wait = self._get_reconnect_wait(self._reconnects)
await asyncio.sleep(reconnect_wait)
self._connect()
async def send_ping(self):
if self._socket:
await self._socket.ping()
async def cancel(self):
self._conn.cancel()
self._socket = None
类重新连接WebSocket:
STREAM_URL=URL
最大重新连接数=5
最大重新连接时间=60秒
最小重新连接等待时间=0.1
超时=10
def uu init uuu(self、loop、path、coro、socket_type='spot',prefix='ws/'):
自我循环=循环
self.\u log=logging.getLogger(\uuuu name\uuuuu)
self.\u路径=路径
自我。_coro=coro
self.\u prefix=前缀
self.\u重新连接=0
自连接=无
self.\u插座=无
self._connect()
def_连接(自):
self.\u conn=asyncio.确保未来(self.\u run(),loop=self.\u loop)
异步def_运行(自):
ws\u url=self.STREAM\u url+self.\u前缀+self.\u路径
使用ws.connect(ws_url)作为套接字异步:
self.\u插座=插座
self.\u重新连接=0
尝试:
尽管如此:
尝试:
evt=wait asyncio.wait_for(self.\u socket.recv(),timeout=self.timeout)
除asyncio.TimeoutError外:
等待自我。发送\u ping()
除asyncio.Cancelled错误外:
等待自我。发送\u ping()
其他:
尝试:
evt_obj=json.loads(evt)
除值错误外:
通过
其他:
等待自我(evt_obj)
除ws.Connection关闭为e外:
等待自我
例外情况除外,如e:
等待自我
def\u获取\u重新连接\u等待(self,尝试次数:int)->int:
世博会=2次**尝试
返回回合(随机()*min(self.MAX\u秒,expo-1)+1)
异步def_重新连接(自):
等待自我。取消
self._重新连接+=1
如果self.\u重新连接
你知道这个代码有什么问题吗