我正在尝试使用带有ProtoRPC的memcache来加速一些进程(带有Python的Google App Engine )。为了简化问题,我使用了Hello World示例,并对其进行了一些修改。以下是我的版本:
from protorpc import messages
from protorpc import remote
from protorpc.wsgi import service
from google.appengine.api import memcache
class HelloRequest(messages.Message):
my_name = messages.StringField(1, required=True)
class ElementOfArrayResponse(messages.Message):
value=messages.IntegerField(1)
class HelloResponse(messages.Message):
hello = messages.StringField(1, required=True)
list = messages.MessageField(ElementOfArrayResponse, 2, repeated=True)
class HelloService(remote.Service):
@remote.method(HelloRequest, HelloResponse)
def hello(self, request):
response = memcache.get(request.my_name)
if response is None:
list = []
for i in range(7):
list.append(SomeElementResponse(value=i))
response = HelloResponse(hello='Hello there, %s!' % request.my_name, list=list)
memcache.set(request.my_name,response)
return response
app = service.service_mappings([('/hello.*', HelloService)])但是,不幸的是,这段代码返回了一个错误:ERROR 2013-01-12 17:17:31,081 service.py:196] Encountered unexpected error from ProtoRPC method implementation: PicklingError (Can't pickle <type 'weakref'>: attribute lookup __builtin__.weakref failed)。
但是,当我使用与原始HelloResponse几乎相同的代码时,memcache工作得很好。
那么,我做错了什么呢?
发布于 2013-01-14 10:38:15
有两件事,看起来你的memcache键是一个列表对象(要确保你知道这一点)。在您的代码旁边,当放入/取出memcache应用程序接口时,您必须序列化message对象。
重写如下:
from protorpc import remote
from protorpc import messages
from protorpc import protojson
from protorpc.wsgi import service
from google.appengine.api import memcache
class HelloRequest(messages.Message):
my_name = messages.StringField(1, required=True)
class ElementOfArrayResponse(messages.Message):
value=messages.IntegerField(1)
class HelloResponse(messages.Message):
hello = messages.StringField(1, required=True)
list = messages.MessageField(ElementOfArrayResponse, 2, repeated=True)
class HelloService(remote.Service):
@remote.method(HelloRequest, HelloResponse)
def hello(self, request):
response = memcache.get(request.my_name)
if response:
# decode the value to a message..
response = protojson.decode_message(HelloResponse, response)
else:
list = []
for i in range(7):
list.append(SomeElementResponse(value=i))
response = HelloResponse(hello='Hello there, %s!' % request.my_name, list=list)
# encode the message to a serializable format..
value = protojson.encode_message(message)
memcache.set(request.my_name, value)
return response
app = service.service_mappings([('/hello.*', HelloService)])https://stackoverflow.com/questions/14296243
复制相似问题