我有一个新对象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
,通常此数据库为postgres
或redis
。有工作人员在监视队列,当有东西添加到队列中时,网络上具有可用处理资源的工作人员会拿起任务,执行处理,然后将该任务标记为已完成。
因此,当您触发行another_function.apply_async
时,这意味着名为another_function
的任务被添加到队列中,并且传入的任何参数值也是如此。这意味着所有参数都需要串行化,以便存储在数据库postgres
或redis
中。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中。
您可以创建一个自定义函数,将返回的api
1对象转换为json dict,然后将该json dictt传递到celener任务调用参数中。