GAE python ndb put_async问题

时间:2014-04-29 10:42:04

标签: google-app-engine python-2.7 google-cloud-datastore

我有一个名为Conversation的模型,其中一些字段包含date_createddate_updated DateTimePropterty auto_now_addauto_now。< / p>

如果我使用put()方法更新模型,date_updated字段会更新。 但是当我使用put_async方法时,date_updated字段中的值不会更新。

我也有使用Python的unittest.Testcase的测试用例,它运行正常。

注意:当我使用put_async().get_result()时,它会起作用。

样本模型类:

class Conversation(ndb.Model):

   participants = ndb.StringProperty(repeated=True)  
   conversation_name = ndb.StringProperty()
   date_created = ndb.DateTimeProperty(required=True, auto_now_add=True)
   date_updated = ndb.DateTimeProperty(required=True, auto_now=True)

   @staticmethod
   def update_conversation_date_by_id(conversation_id):
       conversation = Conversation.get_by_id(conversation_id) if conversation_id else None
       if conversation is None:
           raise CannotFindEntity("Given conversation_id is not found")
       else:
           conversation.put_async().get
       return conversation

2 个答案:

答案 0 :(得分:4)

如果请求处理程序在NDB put完成之前退出,那么put可能永远不会发生。

class MyRequestHandler(webapp2.RequestHandler):
  def get(self):
    acct = Account.get_by_id(users.get_current_user().user_id())
    acct.view_counter += 1
    future = acct.put_async()
    # ...read something else from Datastore...
    template.render(...)
    future.get_result()

尝试添加类似该代码块中最后一行的内容以强制它等待。

  

在这个例子中,调用future.get_result有点傻了   应用程序从不使用NDB的结果。那段代码就在那里   确保请求处理程序在NDB放置之前不会退出   饰面;如果请求处理程序退出得太早,则put可能永远不会   发生。为方便起见,您可以使用装饰请求处理程序   @ ndb.toplevel。这告诉处理程序不要退出直到它   异步请求已完成。这反过来让你发送   请求而不用担心结果。

https://developers.google.com/appengine/docs/python/ndb/async

答案 1 :(得分:0)

当主线程停止时,异步方法停止执行(请求处理程序完成)...所以很可能你的代码没有执行。 这可以通过将@ ndb.toplevel添加到请求处理程序来防止。然后处理程序将等待你的异步完成。

https://developers.google.com/appengine/docs/python/ndb/async

async不允许您在请求处理程序完成时运行代码。 async允许您在同一请求处理程序线程上等待异步命令时运行其他(异步)命令:)