Celery错误:"str对象不可调用",getstate()函数是字符串
我在尝试把一个任务传给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数据类型,然后在任务中利用这些信息来重新创建你需要的内容,以便完成任务。