2017-12-18 169 views
6

Mam flask-socket.io aplikację, która jest dość standardowy:flask-socket.io: częste time-out

Serwer: eventlet ja uruchomić aplikację za pomocą: socketio.run (APP, host =” 0.0.0.0')

często, ale nie zawsze mam jakiś timeout:

Traceback (most recent call last): 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/wsgi.py", line 507, in handle_one_response 
    result = self.application(self.environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/flask_socketio/__init__.py", line 42, in __call__ 
    start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/middleware.py", line 47, in __call__ 
    return self.engineio_app.handle_request(environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/socketio/server.py", line 360, in handle_request 
    return self.eio.handle_request(environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/server.py", line 267, in handle_request 
    environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 89, in handle_get_request 
    start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 130, in _upgrade_websocket 
    return ws(environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/async_eventlet.py", line 19, in __call__ 
    return super(WebSocketWSGI, self).__call__(environ, start_response) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 127, in __call__ 
    self.handler(ws) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 155, in _websocket_handler 
    pkt = ws.wait() 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 633, in wait 
    for i in self.iterator: 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 503, in _iter_frames 
    message = self._recv_frame(message=fragmented_message) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 526, in _recv_frame 
    header = recv(2) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 442, in _get_bytes 
    d = self.socket.recv(numbytes - len(data)) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 360, in recv 
    return self._recv_loop(self.fd.recv, b'', bufsize, flags) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 354, in _recv_loop 
    self._read_trampoline() 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 325, in _read_trampoline 
    timeout_exc=socket_timeout('timed out')) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 207, in _trampoline 
    mark_as_closed=self._mark_as_closed) 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/hubs/__init__.py", line 163, in trampoline 
    return hub.switch() 
    File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/hubs/hub.py", line 295, in switch 
    return self.greenlet.switch() 
socket.timeout: timed out 

nie jestem w stanie zinterpretować tego traceback. Czy ktoś z pewnym doświadczeniem w flask-socket.io może pomóc?

Nie zamieszczam żadnego kodu, ponieważ nie wiedziałbym od czego zacząć. Wszystkie pliki w systemie traceback pochodzą z zainstalowanych modułów.

EDYTOWANIE: Mam więcej informacji na temat żądań socket.io. Po powyższy wyjątek następujące wnioski są rejestrowane:

127.0.0.1 - - [04/Jan/2018 10:10:51] "GET /socket.io/?EIO=3&transport=websocket&sid=f93955151a3a4576b2e96427cc27121e HTTP/1.1" 500 0 60.061493 
127.0.0.1 - - [04/Jan/2018 10:10:51] "GET /socket.io/?EIO=3&transport=polling&t=1515056991349-3&sid=f93955151a3a4576b2e96427cc27121e HTTP/1.1" 400 218 60.001593 
127.0.0.1 - - [04/Jan/2018 10:10:52] "GET /socket.io/?EIO=3&transport=polling&t=1515057052758-4 HTTP/1.1" 200 381 0.000875 
(12472) accepted ('127.0.0.1', 39520) 
127.0.0.1 - - [04/Jan/2018 10:10:52] "POST /socket.io/?EIO=3&transport=polling&t=1515057052767-5&sid=10663b1e21e6492b81b5455ebc805408 HTTP/1.1" 200 219 0.001145 
+0

Jak wykonać swój serwer? Czy jest to aplikacja WSGI skonfigurowana dla serwera proxy Nginx, czy po prostu opcja debugowania z wiersza poleceń? Pytam o to, ponieważ mam przeczucie, że serwer jest wykonany w taki sposób, że nie jest w stanie obsłużyć wielu żądań. –

+0

to moje środowisko programistyczne. Bez pośredników. Uruchamiam serwer poleceniem linii – caliph

+0

Czy małpa załatała standardową bibliotekę? – Miguel

Odpowiedz

5

Można użyć socketio.run(app, host='0.0.0.0', port=5000, debug=True) jeśli chcesz, aby przełączyć się w tryb debugowania.


Następnie można spojrzeć na socket.io official documentation website większość Especialy na client-api i server-api. beause w the httpsserver-options część server-api (dla JavaScript), widać, że istnieje kilka opcji podczas uruchamiania serwera, takich jak:

pingInterval: 10000, 
    pingTimeout: 5000, 

Spodziewam się, że argumenty te mogą być ponownie wykorzystane jako kwargs po uruchomieniu wam serwer z socketio.run(app, host='0.0.0.0', port=5000, debug=True,pingInterval = 10000, pingTimeout= 5000)


oraz w dokumentacji flask-socketio w „Obsługa błędów” część, jest n wskazówki lód do deal with exceptions

Możesz dodać coś takiego

@socketio.on_error_default # handles all namespaces without an explicit error handler 
def default_error_handler(e): 
    pass 

Kolejnych wskazówek może być dostosować ten poprzedni error_handler dla kwestii limitu czasu i ponownego uruchomienia serwera, gdy zdarzenie to zostanie wyzwolony.

Można również zauważyć, że:

Argumenty komunikatów i danych z bieżącego żądania mogą być również kontrolowane za pomocą zmiennej request.event, co jest przydatne do rejestrowania błędów i debugowania zewnętrznej obsługi zdarzenia

Możesz także użyć tego następujący kod do obsługi ostateczną socket.timeout: timed out błąd:

try: 
    socketio.run(app,... 
except socket.error as socketerror: 
    print("Error: ", socketerror)