如何将带有对象参数的对象传递给芹菜任务



我有一个新对象model_test_api,如下所示。

import test_script
model_test_api = test_script.TestAPI(api)

需要新CCD_ 3的CCD_。

import model_api
api = model_api.Model_API() 

我正在尝试以下两种方法将model_test_api传递给celery任务。

1. another_function.apply_async(model_test_api)
2. another_function.apply_async(lambda: test_script.TestAPI(api))

然而,他们两个都给了我一个错误kombu.exceptions.EncodeError: Object of type function is not JSON serializable。然后我将model_test_api打包到一个json对象中。

import json
json_test_api = json.dumps(model_test_api.__dict__)
another_function.apply_async(json_test_api)

它给了我另一个错误TypeError: Object of type Model_API is not JSON serializable。有人知道我该怎么办吗?提前谢谢。

在回答问题之前,我们将介绍一些内容,因此芹菜为python启用了事件流。您有一个数据库,其中包含需要处理的任务的queue,通常此数据库为postgresredis。有工作人员在监视队列,当有东西添加到队列中时,网络上具有可用处理资源的工作人员会拿起任务,执行处理,然后将该任务标记为已完成。

因此,当您触发行another_function.apply_async时,这意味着名为another_function的任务被添加到队列中,并且传入的任何参数值也是如此。这意味着所有参数都需要串行化,以便存储在数据库postgresredis中。Celery无法将python对象存储在内存中的队列中,因为它可能是一台完全不同的机器来执行处理,并且它的RAM中没有对象。

我将给出一个推荐实现的示例,假设您有一个名为CIA_Agent_Model的模型,它有三个属性——主键和一些文本字段。您有一个名为another_function的芹菜任务,并且要传入CIA_Agent_Model实例,您可以使用another_function.delay(agent_model_instance.id)调用芹菜任务,其中传入的参数是对象的主键,而不是对象本身。然后在芹菜任务中,您再次通过ID从数据库中获取对象。您还可以序列化模型实例https://www.django-rest-framework.org/api-guide/serializers/并且串行化的结果可以被传递到CCD_ 20中。

您可以创建一个自定义函数,将返回的api1对象转换为json dict,然后将该json dictt传递到celener任务调用参数中。

相关内容

  • 没有找到相关文章

最新更新