반응형

출처 : https://stackoverflow.com/questions/54101923/1006-connection-closed-abnormally-error-with-python-3-7-websockets

python 3.7 websockets에서 비정상적으로 1006 접속 종료 오류

저는 python websockets에서 이러한 github 이슈와 같은 문제가 있습니다.
https://github.com/aaugustin/websockets/issues/367

제안된 해결책은 저는 작동하지 않습니다. 제가 본 오류는

websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason

이는 제 코드입니다.

async def get_order_book(symbol):
    with open('test.csv', 'a+') as csvfile:
        csvw = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        DT = Data(data=data, last_OB_id=ob_id, last_TR_id=tr_id, sz=10, csvw=csvw)

        while True:
            if not websocket.open:
                print('Reconnecting')
                websocket = await websockets.connect(ws_url)
            else:
                resp = await websocket.recv()
                update = ujson.loads(resp)
                DT.update_data(update)

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())

내가 테스트 한 방법은 인터넷 연결을 종료하는 것이지만 10초 후에도 여전히 1006 오류가 반환됩니다.

Python 3.7 및 Websockets 7.0을 실행하고 있습니다.

당신의 생각이 무엇인지 알려주십시오. 감사합니다!

5개의 답변 중 1개의 답변만 추려냄

저도 같은 문제에 직면했습니다. 잠시 동안 파고들자 다시 연결하라는 여러 버전의 답변을 찾았지만 합리적인 방법이라고 생각하지 않았으므로 더 파고 들었습니다.

DEBUG 레벨 로깅을 활성화하면 파이썬 웹소켓이 기본적으로 핑 패킷을 보내고 응답을 받지 못하면 연결 시간이 초과된다는 것을 알았습니다. 이것이 표준과 일치하는지 확실하지 않지만 적어도 파이썬 스크립트 시간이 초과되는 서버에는 적어도 자바 스크립트의 웹 소켓은 완전히 좋았습니다.

수정은 간단합니다. connect (연결)하기 위한 다른 kw 인수를 추가합니다.

websockets.connect(uri, ping_interval=None)

같은 인자는 서버쪽 함수 serve로 작동해야 합니다.

https://websockets.readthedocs.io/en/stable/api.html에서 정보를 더 얻을 수 있습니다.

반응형
반응형

어떻게 접속이 끊어졌을 때 자동으로 재접속할 수 있나요?

issue 414를 보세요.


재접속을 위한 공통 패턴

pgrandinetti님 질문

몇 개의 제 프로젝트에서 접속 오류나 재접속 시도가 발생할 수 있는 시나리오를 다루기 위해 다음처럼 진행합니다.

async def listen_forever(self):
        while True:
        # 접속을 실패할 때마다 밖의 루프는 재실행됨
            try:
                async with websockets.connect(self.url) as ws:
                    while True:
                    # listener loop
                        try:
                            reply = await asyncio.wait_for(ws.recv(), timeout=***)
                        except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed):
                            try:
                                pong = await ws.ping()
                                await asyncio.wait_for(pong, timeout=self.ping_timeout)
                                logger.debug('Ping OK, keeping connection alive...')
                                continue
                            except:
                                await asyncio.sleep(self.sleep_time)
                                break  # 안쪽 loop
                        # dreply 객체로 작업을 진행합니다.
            except socket.gaierror:
                # 뭔가 로그를 남깁니다.
                continue
            except ConnectionRefusedError:
                # 뭔가 다른 것을 로그로 남깁니다.
                continue

저는 (1)이것이 괜찮은지 궁금하고요. (2) websockets에 이미 반복적인 행위같은 것을 처리하기 위해 제공되는 지름길 같은 방법이 있는지도 궁금합니다. (맞다고 가정합니다!)

aaugustin님 답변

이를 구현한 웹소켓에서 지름길 같은 방법은 없습니다.

이 사용 사례에 관해 이전에 들었고 저는 유효하다고 갱각합니다.

저는 좋은 API를 제공할 수 있을 지 확실하지는 않습니다. -- 저는 사용자 코드가 접속할 때 혹은 접속이 끊어졌을 때 이 작업(재접속)을 해야될 것으로 예상되지만 어떻게 이를 처리해야할지는 확실하지 않습니다.

heckad님 질문

이 특징을 추가하기 위해 필요한 것은 무멋이 있을까요?

aaugustin님 추가 제안

이 특징을 위해 저는 다음을 제안합니다.

  • 첫째, 이 특징이 정확히 반응하는지 묘사하는 문서가 필요합니다.
  • 우리가 그것에 동의하면 테스트와 함께 구현하겠습니다.

pgrandinetti 님 답변

@heckad 저는 최소한의 재생산 가능한 예시를 여기에 작성하였습니다.
https://gist.github.com/pgrandinetti/964747a9f2464e576b8c6725da12c1eb

반응형

+ Recent posts