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.

Aplicación de Celery con almacenamiento en memoria colgada.

Estoy desarrollando un conjunto de pruebas para una aplicación Flask utilizando Celery para procesar tareas en segundo plano.

Estoy trabajando en pruebas de integración y he estado intentando configurar un worker en vivo embebido según la documentación (https://docs.celeryproject.org/en/latest/userguide/testing.html)

conftest.py

@pytest.fixture(scope='session')
def celery_config():
    return {
        'broker_url': 'memory://localhost/',
        'result_backend': 'memory://localhost/',
    }

@pytest.fixture(scope='module')
def create_flask_app():
    # eliminar todos los registros en testDatabase antes de comenzar el nuevo módulo de prueba
    db = connect(host=os.environ["MONGODB_SETTINGS_TEST"], alias="testConnect")
    for collection in db["testDatabase"].list_collection_names():
        db["testDatabase"].drop_collection(collection)
    db.close()

# Crear un cliente de prueba utilizando la aplicación Flask configurada para pruebas
flask_app = create_app()
return flask_app

@pytest.fixture(scope='function')
def test_client(create_flask_app):
    """
    Establecer un cliente de prueba para usar dentro de cada módulo de prueba
    """
    with create_flask_app.test_client() as testing_client:
        with create_flask_app.app_context():
            yield testing_client 

@pytest.fixture(scope='function')
def celery_app(create_flask_app):
    from celery.contrib.testing import tasks
    from app import celery
    return celery

Estoy intentando ejecutar las pruebas utilizando la memoria local como backend. Sin embargo, las tareas se quedan colgadas y el conjunto de pruebas nunca termina de ejecutarse.

Cuando ejecuto las pruebas con un backend de redis (y inicializo redis en mi máquina de desarrollo), todo funciona bien. Pero me gustaría no depender de redis al ejecutar las pruebas.

¿Estoy haciendo algo mal en la configuración? ¿Alguien tiene alguna idea de por qué las tareas se quedan colgadas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el uso del backend de memoria para Celery en su suite de pruebas. Según la documentación de Celery, el backend de memoria no es adecuado para su uso en producción, ya que no persiste los resultados ni es compatible con la concurrencia. Además, el broker de memoria no proporciona la misma confiabilidad que otras soluciones de broker como Redis, RabbitMQ o Amazon SQS.

    Dado que mencionó que las pruebas se ejecutan correctamente con un backend de Redis, podría valer la pena considerar el uso de Redis en lugar del backend de memoria para su entorno de pruebas. Alternativamente, podría intentar utilizar otra opción de broker/almacenamiento, como RabbitMQ o PostgreSQL, que admita la durabilidad y concurrencia requerida para sus tareas de Celery.

    Si desea continuar utilizando el backend de memoria, es posible que desee revisar las definiciones de sus tareas y asegurarse de que no dependan de recursos o servicios externos que puedan estar causando el bloqueo. También puede querer monitorear los registros de Celery mientras las pruebas se ejecutan para ver si se generan errores o advertencias.

    En general, es importante asegurarse de que su entorno de pruebas imite de cerca su configuración de producción, por lo que considere revisar sus requisitos y limitaciones al elegir el mejor backend para sus trabajos de Celery.

Comments are closed.