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.

¿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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que celery no puede serializar el objeto model_test_api porque contiene tipos de datos no serializables como funciones o clases personalizadas como Model_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 de celery 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 objeto TestAPI dentro de la tarea de la siguiente manera:

    @celery.task
    def another_function(api_data):
        api = model_api.Model_API()
        model_test_api = test_script.TestAPI(api)
        # utilizar model_test_api según sea necesario
    

    Luego, puedes pasar los datos necesarios a la tarea utilizando el método apply_async():

    another_function.apply_async(kwargs={'api_data': api_data})
    

    Aquí, api_data es un diccionario que contiene los datos necesarios para instanciar el objeto TestAPI 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.

Comments are closed.