Celery任务有不可推断的参数

时间:2013-11-06 17:14:47

标签: python celery message-queue mq google-adwords

我正在尝试实施一个消息传递队列系统,以便将操作推送到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方法是什么?

2 个答案:

答案 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)

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