2014-04-29 4 views
0

내가 auto_now_addauto_nowDateTimeProptertydate_createddate_updated를 포함 일부 필드와 Conversation라는 모델을했습니다.GAE 파이썬 NDB put_async 문제

put() 메서드를 사용하여 모델을 업데이트하면 date_updated 필드가 업데이트되고 있습니다. 그러나 put_async 메서드를 사용하면 date_updated 필드의 값이 업데이트되지 않습니다.

또한 파이썬의 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 
+0

[ndb async가 응용 프로그램 요청이 완료된 후에 실행할 수 있습니까?] (http://stackoverflow.com)/questions/11621313/is-ndb-async-guarantee-after-after-application-request-has-finished) –

답변

4

NDB 넣어은 풋은 결코 일어나지 않을 수도 완료되기 전에 요청 처리기가 종료합니다.

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

0

비동기 방식 때문에 대부분 코드가 실행 그다지 ... 메인 스레드가 정지 할 때 (요청 처리 완료)의 실행을 중지. 요청 처리기에 @ ndb.toplevel을 추가하여이를 방지 할 수 있습니다. 처리기는 비동기가 완료 될 때까지 대기합니다. 요청 핸들러가 완료되면

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

비동기는 코드를 실행할 수 있도록 나던. async을 사용하면 동일한 요청 처리기 스레드에서 비동기 명령을 기다리는 동안 다른 (비동기) 명령을 실행할 수 있습니다.

관련 문제