Python 带有不可拾取参数的芹菜任务

Python 带有不可拾取参数的芹菜任务,python,celery,message-queue,mq,google-ads-api,Python,Celery,Message Queue,Mq,Google Ads Api,我正在尝试实现一个消息队列系统,以将操作推送到AdWords API class Call(object): @celery.task(filter=task_method) def MUTATE(self, operations): assert hasattr(self, '__throwaway_service') with self.__throwaway_service as sm: response = sm.

我正在尝试实现一个消息队列系统,以将操作推送到AdWords API

 class Call(object):
    @celery.task(filter=task_method)
    def MUTATE(self, operations):
        assert hasattr(self, '__throwaway_service')
        with self.__throwaway_service as sm:
            response = sm.mutate(operations)
        return response
由于我不能将服务实例用作参数(服务具有向API发送“get”或“mutate”请求的方法),因此我将其设置为外部属性,并在将该特定服务的所有操作发送到MQ时将其删除

“operations”是包含字符串或unicode键和值的字典列表

我还是会

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
PicklingError:无法pickle:属性查找\uuuu内置\uuuu。instancemethod失败

我得到这个错误是因为芹菜任务使用的是实例方法吗?实现这一点的最佳方式是什么?

操作中可能有一个对象。在将对象传递给芹菜任务之前,您需要将其处理为字典或其他本机类型。

操作中可能有一个对象。在将对象传递给芹菜任务之前,您需要将其处理为字典或其他本机类型。

若要运行此
MUTATE
任务,必须将
Call
的实例传递给队列。我想你的电话,包括像
\uuuuuu throwaway\u服务
这样的花哨方法,很难被挑选。因此,您必须重新设计您的任务,在任务中重建
self
对象,然后应用原始
MUTATE

此外,您可能会发现找出哪些对象不能被腌制很有用

更新

这种模式是否适用:

@celery.task
def mutate(service_settings, operations):
    service = Service(**service_settings)
    return service.mutate(operations)

要运行此
MUTATE
任务,必须将
Call
的实例传递给队列。我想你的电话,包括像
\uuuuuu throwaway\u服务
这样的花哨方法,很难被挑选。因此,您必须重新设计您的任务,在任务中重建
self
对象,然后应用原始
MUTATE

此外,您可能会发现找出哪些对象不能被腌制很有用

更新

这种模式是否适用:

@celery.task
def mutate(service_settings, operations):
    service = Service(**service_settings)
    return service.mutate(operations)

我认为问题在于你的任务方法在一个类中,你能试着在一个普通的python函数中转换你的“MUTATE”方法并用那种方式测试它是否有效吗?问题是服务实例。我需要它,因为我是在那个服务上推动运作的。所以,如果我将方法作为函数,服务必须是一个参数,它不能,因为它是不可拾取的。不幸的是,课堂上没有任何变化。我只是Stuck我认为问题在于你的任务方法在一个类中,你能试着在一个普通的python函数中转换你的“MUTATE”方法并测试它是否有效吗?问题是服务实例。我需要它,因为我是在那个服务上推动运作的。所以,如果我将方法作为函数,服务必须是一个参数,它不能,因为它是不可拾取的。不幸的是,课堂上没有任何变化。我只是被卡住了。您将如何重新设计此任务?我需要一个服务实例,我假设它是不可点击的部分,以及推送到这个服务的操作。我真的想不出另外一种方法,它没有“服务作为实例”属性或“任务参数”,您如何实例化这个实例?它只是带有一些auth参数的api包装器吗?你能提供关于你的类/实例的更多细节吗?带有MUTATE的类是一个没有init的父类。它从许多子类收集操作(和相关服务)。收集所有操作后,我想为每对服务操作调用MUTATE方法,并将其发送到队列。我应该把MUTATE方法放在一个孤立的类实例中吗?请参阅答案的更新。我不确定我是否理解您的意思,您最好添加一些代码示例。是的,我需要在层次结构中更改很多代码,但基本上我在运行时获取服务实例太早了。现在,我传递参数来获取服务,而不是服务实例,然后调用方在它的一个方法中实例化服务。您将如何重新设计此任务?我需要一个服务实例,我假设它是不可点击的部分,以及推送到这个服务的操作。我真的想不出另外一种方法,它没有“服务作为实例”属性或“任务参数”,您如何实例化这个实例?它只是带有一些auth参数的api包装器吗?你能提供关于你的类/实例的更多细节吗?带有MUTATE的类是一个没有init的父类。它从许多子类收集操作(和相关服务)。收集所有操作后,我想为每对服务操作调用MUTATE方法,并将其发送到队列。我应该把MUTATE方法放在一个孤立的类实例中吗?请参阅答案的更新。我不确定我是否理解您的意思,您最好添加一些代码示例。是的,我需要在层次结构中更改很多代码,但基本上我在运行时获取服务实例太早了。现在,我传递参数以获取服务,而不是服务实例,然后调用方在其方法之一内实例化服务。