Python 3.x Python 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 _

我从互联网上获得了这段代码,但很快websocket就关闭了,我不知道为什么。 似乎没有正确调用_reconnect函数,但由于我不擅长websocket与异步相结合,我不知道

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重新连接
你知道这个代码有什么问题吗