1

我正在尝试实现一个消息队列系统来将操作推送到 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。

“操作”是包含字符串或 Unicode 键和值的字典列表。

我仍然得到

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

我收到这个错误是因为 celery 任务完全使用了实例方法吗?实现这一点的最佳和 Pythonic 方式是什么?

4

2 回答 2

1

要运行此MUTATE任务,Call必须将 的实例传递给队列。我想您的 Call 包含诸如__throwaway_service很难选择的奇特方法。所以你必须重新设计你的任务,self在任务中重建对象,然后应用原始对象MUTATE

此外,您可能会发现此配方有助于找出究竟哪些对象不能被腌制。

更新

此模式是否适用:

@celery.task
def mutate(service_settings, operations):
    service = Service(**service_settings)
    return service.mutate(operations)
于 2013-11-06T20:06:23.647 回答
0

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

于 2013-11-06T19:44:52.273 回答