我正在尝试实施一个消息传递队列系统,以便将操作推送到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
我是否收到此错误,因为芹菜任务正在使用实例方法?实现这个目标的最佳和pythonic方法是什么?
答案 0 :(得分:1)
要运行此MUTATE
任务,必须将Call
的实例传递给队列。我想你的召唤,包含__throwaway_service
这样的花哨方法几乎不可挑选。因此,您必须重新设计任务,在任务中重建self
对象,然后再应用原始MUTATE
。
此外,您可能会发现this reciepe非常有用,可以找出哪些对象无法被腌制。
<强>更新强>
这种模式是否适用:
@celery.task
def mutate(service_settings, operations):
service = Service(**service_settings)
return service.mutate(operations)
答案 1 :(得分:0)
操作中可能有一个对象。在将对象传递给芹菜任务之前,您需要将对象处理为字典或其他本机类型。