Celery错误:"str对象不可调用",getstate()函数是字符串

1 投票
1 回答
1414 浏览
提问于 2025-04-16 20:43

我在尝试把一个任务传给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

你正在尝试把一个对象传给一个任务,但这个对象不能被序列化。试着传一些更简单的数据(这些数据可以让你在任务运行时重新创建复杂的对象)。

我不确定这是否是你错误的真正原因,但无论如何,你不应该把Django模型传给任务。否则你可能会遇到竞争条件的问题。关于这个话题,可以查看Celery的文档

这些模型不应该作为任务的参数传递。通常在任务运行时,从数据库重新获取对象会更好,因为使用旧的数据可能会导致竞争条件。

相反,传递用户对象的唯一标识符和任何需要识别Facebook点赞互动的信息,使用简单的Python数据类型,然后在任务中利用这些信息来重新创建你需要的内容,以便完成任务。

撰写回答