2016-09-07 11 views
1

가끔씩 플라스크 socket-io가 멈추는 데 문제가 있습니다. 문제를 해결할 방법이 없습니다.플라스크 socket-io, 때로는 클라이언트 호출로 서버가 고정됩니다.

내 클라이언트가 내 socket-io 서버에 연결하고 일부 채팅 세션을 수행합니다. 그것은 잘 작동합니다. 그러나 어떤 이유로 클라이언트 측에서 가끔씩 전체 서버를 차단하는 호출이 있습니다 (서버가 처리되지 않고 다른 모든 호출이 고정되어 있음). 이상한 점은 클라이언트 측 앱이 완전히 종료되지 않은 한 서버를 차단할 수 있다는 것입니다. 이것은 ios-app/web 페이지이며 완전히 앱 또는 사파리 페이지를 닫아야합니다. 소켓 자체를 닫고 할당을 해제해도 문제가 해결되지 않습니다. 응용 프로그램이 백그라운드에있을 때 소켓은 닫히고 할당이 해제되지만 문제는 지속됩니다.

이것은 작은 서버이며 html 페이지와 소켓 서버를 모두 처리하므로 프로세스 자체를 차단하는 html 또는 소켓 자체인지 전혀 알 수 없습니다. 그러나 서버가 정지 할 때마다 로그에 소켓 호출이 표시됩니다.

socketio = SocketIO(app, ping_timeout=5) 
socketio.run(app, host='0.0.0.0', port=5001, debug=True, ssl_context=context) 

그래서 제 질문은 다음과 같습니다 : (이것이 내가 오랜 시간 동안 열려있는 응용 프로그램 또는 웹 사이트를 떠날 때 발생하는 것 같습니다 서버를 고정 할 수 있습니다 여기에서

내가 내 서버를 구성하는 방법입니다 아무것도하지 않고). 서비스를 정상적으로 사용하면 서버가 절대로 멈추지 않습니다. 그리고 나는이 원인이 무엇인지하더라도 (발생하는 것을 방지 할 수있는 방법, 맹목적 전화에 부착되는 내 서버를 중지하는 방법은 무엇입니까? 답변

+0

eventlet 또는 gevent를 사용하고 있습니까? 그렇다면 파이썬 표준 라이브러리에 원숭이 패치를 했습니까? 귀하의 질문에 진술하십시오. 또한 5 초의 핑 타임 아웃을 사용하는 이유는 무엇입니까? 극단적 인 것으로 보이며 핑/퐁 트래픽이 높을 것이므로 일반적으로 간격을 기본값에서 변경하지 않아도됩니다. – Miguel

+0

eventlet 또는 gevent를 사용하지 않습니다. 나는 단순히 Flask의 개발 웹 서버를 사용하고 있습니다. 좀 더 견고한 개발 웹 서버를 사용해야한다고 생각하십니까? 5 초 동안 타임 아웃을 위해 소켓을 호출을 막을 수 없다고 생각했습니다. –

답변

1

따르면 대한

감사를 위의 귀하의 의견에, 당신은 이벤트 티켓이나 gevent 같은 비동기 프레임 워크의 도움없이 플라스크 개발 웹 서버를 사용하고 있습니다.이 옵션 외에도 매우 비효율적 인, 당신은이 웹 서버는 전투 테스트되지 않은 것을 알아야합니다 개발 기간 동안 짧은 테스트를 거쳤습니다. 플라스크 - 소켓 아이오 (Plask-SocketIO)가 보통의 플라스크 (Flask) 앱을 사용하지 않는 이상한 상황에서 아주 오랫동안 작동 할 수 있는지 확신 할 수 없습니다. Werkzeug에있는 일부 애매한 버그로 인해 멈추었습니다.

내가 권장하는 것은 eventlet을 설치하고 다시 시도하는 것입니다. 당신이해야 할 일은 pip install eventlet이고 명시적인 async_mode 인수를 전달하지 않는다고 가정하면 Flask-SocketIO가이 패키지를 사용하기 만하면이 패키지를 사용할 수 있습니다.

또한 명시 적 제한 시간 설정을 제거합니다. 거의 모든 경우에 기본값은 정상적인 연결을 유지하기에 충분합니다.