Ошибка сельдерея: «объект str не вызывается», функция getstate () является строкой - PullRequest
1 голос
/ 02 июля 2011

Я получаю эту ошибку, когда пытаюсь передать задачу работнику Celery.Вот обратная связь

Traceback:
File "/home/vivek/xpython/lib/python2.6/site-packages/Django-1.3-py2.6.egg/django/core/handlers/base.py" in get_response
111.                         response = callback(request, *callback_args, **callback_kwargs)

File "/home/vivek/projects/engine/engine/web/models.py" in fb_sync
53.         process_metadata.delay(self, wrapper)

File "/home/vivek/xpython/lib/python2.6/site-packages/celery-2.2.7-py2.6.egg/celery/task/base.py" in delay
338.         return self.apply_async(args, kwargs)

File "/home/vivek/xpython/lib/python2.6/site-packages/celery-2.2.7-py2.6.egg/celery/task/base.py" in apply_async
460.                                          **options)

File "/home/vivek/xpython/lib/python2.6/site-packages/celery-2.2.7-py2.6.egg/celery/app/amqp.py" in delay_task
230.         send(body, exchange=exchange, **extract_msg_options(kwargs))

File "/home/vivek/xpython/lib/python2.6/site-packages/kombu-1.1.6-py2.6.egg/kombu/compat.py" in send
101.         return self.publish(*args, **kwargs)

File "/home/vivek/xpython/lib/python2.6/site-packages/kombu-1.1.6-py2.6.egg/kombu/messaging.py" in publish
124.                 compression, headers)

File "/home/vivek/xpython/lib/python2.6/site-packages/kombu-1.1.6-py2.6.egg/kombu/messaging.py" in _prepare
147.              body) = encode(body, serializer=serializer)

File "/home/vivek/xpython/lib/python2.6/site-packages/kombu-1.1.6-py2.6.egg/kombu/serialization.py" in encode
119.         payload = encoder(data)

File "/home/vivek/xpython/lib/python2.6/copy_reg.py" in _reduce_ex
84.         dict = getstate()



 Exception Type: TypeError at /login/
  Exception Value: 'str' object is not callable

    /home/vivek/xpython/lib/python2.6/copy_reg.py in _reduce_ex
        dict = getstate() ...

local variables
 {'args': (<web.models.User object at 0x8b47b4c>,<web.fb.Facebook object at 0x8b4fbac>),
 'eta': None,
 'expires': None,
 'id': '8d8e6c0b-a269-4780-9c48-77e689037322',
 'kwargs': {},
 'retries': 0,
 'task': 'web.models.process_likes'}


What is the solution to this problem? When I remove the task decorator, it works fine.

1 Ответ

2 голосов
/ 03 июля 2011

Вы пытаетесь передать объект в задачу, которую нельзя сериализовать.Попробуйте передать более простые данные (информацию, которая позволит вам воссоздать сложные объекты при запуске задачи).

Не уверен, является ли это истинной причиной вашей ошибки, но вы все равно не должны передавать модели Django задачам.В противном случае вы столкнетесь с условиями гонки.См. Документацию Celery по теме:

Они не должны передаваться в качестве аргументов задачам.Почти всегда лучше повторно извлечь объект из базы данных, когда задание выполняется вместо этого, так как использование старых данных может привести к условиям гонки.

Передайте уникальный ключ для пользовательского объекта и всего, что вывместо этого нужно идентифицировать взаимодействие Facebook Like как простые типы Python и использовать эту информацию из задачи для воссоздания того, что вам нужно для выполнения задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...