¿Cómo pasar un objeto con un parámetro objeto a una tarea de Celery?
Tengo un objeto model_test_api
que es nuevo de la siguiente manera.
import test_script
model_test_api = test_script.TestAPI(api)
El api
que requiere crear el TestAPI
también es un objeto.
import model_api
api = model_api.Model_API()
Estoy intentando los siguientes dos métodos para pasar model_test_api
a una tarea de celery
.
1. another_function.apply_async(model_test_api)
2. another_function.apply_async(lambda: test_script.TestAPI(api))
Sin embargo, ambos me dieron un error kombu.exceptions.EncodeError: Object of type function is not JSON serializable
. Luego estoy empaquetando model_test_api
en un objeto JSON.
import json
json_test_api = json.dumps(model_test_api.__dict__)
another_function.apply_async(json_test_api)
Me da otro error TypeError: Object of type Model_API is not JSON serializable
. ¿Alguien tiene idea de qué debo hacer? Gracias de antemano.
davy.ai
El problema es que
celery
no puede serializar el objetomodel_test_api
porque contiene tipos de datos no serializables como funciones o clases personalizadas comoModel_API
. Una solución podría ser escribir serializadores personalizados para esos tipos no serializables. Sin embargo, un enfoque más sencillo sería pasar solo los datos necesarios a la tarea decelery
e instanciar el objeto dentro de la tarea misma.Por ejemplo, podrías modificar la tarea
another_function
para que acepte los datos necesarios como parámetros e instancie el objetoTestAPI
dentro de la tarea de la siguiente manera:Luego, puedes pasar los datos necesarios a la tarea utilizando el método
apply_async()
:Aquí,
api_data
es un diccionario que contiene los datos necesarios para instanciar el objetoTestAPI
dentro de la tarea.Este enfoque evita la necesidad de una serialización personalizada y asegura que la tarea tenga acceso a la versión más reciente de los objetos utilizados.