Estoy desarrollando una API donde los usuarios pueden enviarme solicitudes POST. Cuando se reciben solicitudes, quiero una cola para procesarlas.
Cuando mis solicitudes de datos se envían a la cola de apio, quiero que mis trabajadores (servidor remoto) manejen sus.
Para esto, uso:
Quiero que mi código siga los métodos de programación de clases , por lo que me gustaría usar la clase Celery.Task.
Mi código a continuación:
# server.py # Module imports from fastapi import ( FastAPI, Request ) from fastapi.responses import ( JSONResponse ) import uvicorn # Own module from tasks import ( client, add ) # Environment app = FastAPI() # Endpoints @app.post('/post/{name}') def get_post(request: Request, name: str): result_not_working = client.delay(1, 2) # Not working result_working = add.delay(1, 2) # Working return JSONResponse(status_code=200, content={"status": 200, "message": f"You post {result.get()}"}) if __name__ == "__main__": uvicorn.run(app, host='', port=) # tasks.py from celery import ( Celery, Task ) # Environment app = Celery('test_celery', broker=f"amqp://RABBITMQ_USER:RABBITMQ_PWD@RABBITMQ_HOST:RABBITMQ_PORT/RABBITMQ_DB", backend='rpc://') # Class class Client(Task): name = "tasks.PandasClient" def run(self, x, y, **kwargs): return x + y @app.task(name="add") def add(x, y): return x + y client = Client() app.tasks.register(client)Ahí está mi problema: cuando llamé a mi objeto de cliente en server.py (el cliente es una instancia de Cliente, que está registrada en mi cola de Apio), aparece el error:
NotImplementedError: no se configuró ningún backend de resultados.
PERO cuando importo y llamo a mi función de agregar en server.py, funciona sin problemas.
Cosa extraña, cuando ejecuto mi trabajador con el comando apio -A tareas trabajador --loglevel=info , puedo ver:
Me dice que la URL de mi corredor está configurada correctamente, entonces, ¿por qué no mi backend (que funciona cuando llamo a la función y no agrego la clase Client.run)
La documentación no explica cómo construir la clase Task
encontré la solución,
en lugar de registrar mi tarea con:
app.tasks.register(client)Escribí:
app.register_task(client)y funciona.