4

ProtoRPC で memcache を使用して、一部のプロセス (Google App Engine with Python) を高速化しようとしています。質問を簡単にするために、 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 はうまく機能します。

それで、私は何を間違っていますか?

4

1 に答える 1

5

2つ、memcacheキーがListオブジェクトのように見えます(それを認識していることを確認したい)。コードの横で、 APImessageを出し入れするときに、オブジェクトをシリアル化する必要があります。memcache

これが書き直しです:

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)])
于 2013-01-14T02:38:15.233 に答える