es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La aplicación Flask-Socketio está recibiendo un error de tiempo de espera en Heroku.

Disculpas, soy nuevo en el desarrollo web y estoy intentando configurar una aplicación Flask-SocketIO en Heroku mediante el uso de gunicorn con gevent-websocket para soporte WebSocket. Sin embargo, mi aplicación no funciona. He preparado un ejemplo simple para tratar de ilustrar mejor el problema.

Aquí está mi application.py (no usa sockets aquí, pero sí en la versión real)

from flask import Flask, render_template
from flask_socketio import SocketIO
import os

app = Flask(__name__)
app.secret_key = os.environ.get('SECRET')
socketio = SocketIO(app)

@app.route("/")
def index():
    return render_template("index.html")

app.run()

Aquí está mi index.html (actualmente no hace nada)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    test page
</body>
</html>

Aquí está mi archivo requirements.txt

bidict==0.21.4
click==8.0.3
Flask==2.0.2
Flask-SocketIO==5.1.1
gevent==21.8.0
gevent-websocket==0.10.1
greenlet==1.1.2
gunicorn==20.1.0
importlib-metadata==4.8.2
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
python-engineio==4.3.0
python-socketio==5.5.0
typing_extensions==4.0.0
Werkzeug==2.0.2
zipp==3.6.0
zope.event==4.5.0
zope.interface==5.4.0

Y estoy ejecutando la aplicación con este comando en mi Procfile

web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 application:app

La aplicación no funciona y la página dice que revise los registros. Cuando reviso los registros, veo este error:

at=error code=H12 desc="Request timeout" method=GET path="/favicon.ico" host=test-flasksocket.herokuapp.com request_id=c0acb584-c18e-4c86-ba4c-3d176de5b3ed fwd="174.134.134.150" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https

Además, en los registros se repite indefinidamente este texto:

[2021-11-28 04:36:17 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:17)
[2021-11-28 04:36:17 +0000] [17] [INFO] Worker exiting (pid: 17)
[2021-11-28 04:36:17 +0000] [19] [INFO] Booting worker with pid: 19
* Serving Flask app 'application' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Pensé que gunicorn era un servidor de producción, ¿pero parece ser un servidor de desarrollo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, el mensaje de error indica que hubo un tiempo de espera de solicitud mientras intentaba cargar /favicon.ico en el sitio. Esto probablemente se debe al hecho de que la página está intentando cargar un favicon que no existe.

    Para resolver este problema, puede crear un archivo favicon.ico en blanco y agregarlo al directorio raíz de su proyecto. Alternativamente, puede eliminar la siguiente línea de su archivo index.html:

    <link rel="shortcut icon" type="image/png" href="{{ url_for('static', filename='favicon.ico') }}">
    

    En cuanto al problema con la aplicación que no funciona, los registros muestran que está experimentando un tiempo de espera del trabajador porque no se está enviando ninguna respuesta desde el servidor dentro del límite de tiempo de 30 segundos. Esto podría ser causado por una variedad de problemas, como código de bloqueo, rendimiento lento de la aplicación o recursos insuficientes asignados al dyno.

    Para resolver este problema, puede intentar aumentar el número de trabajadores en el archivo Procfile o aumentar el límite de tiempo de espera. También puede buscar la optimización de su código para asegurarse de que no esté bloqueando y que sea eficiente. Además, puede verificar si hay problemas de memoria o rendimiento que podrían estar causando el tiempo de espera.

    Por último, el servidor Gunicorn es un servidor de producción que se utiliza para implementar su aplicación Flask en Heroku. El mensaje de advertencia en los registros solo le está informando que actualmente la aplicación se está ejecutando en un servidor de desarrollo, pero este no es el servidor de producción que debe usar para una implementación real.

Comments are closed.