2012-07-23 3 views
7

ndb를 사용하여 애플리케이션 요청마다 일부 데이터를 기록하는 프로파일 링 모델을 작성하고 있습니다. 각 요청은 ndb.put_async에 의해 ndb 요청을 호출하여 데이터를 기록하지만 클라이언트는 결과에 대해 신경 쓰지 않습니다. 본질적으로, 나는 프로파일 링을위한 통계 데이터 저장을 기다리는 애플리케이션 요청을 원하지 않는다.응용 프로그램 요청이 완료된 후 ndb async가 실행되도록 보장됩니까?

그러나 공식 문서의 설명에 대해 혼란 스러웠습니다. ndb 요청이 완료되기 전에 응용 프로그램 요청이 완료되면 ndb 요청은 여전히 ​​끝날 것입니까? 문서는 요청 핸들러가 너무 일찍 존재

경우, 풋이는 무슨 일이 일어날 지 기준에서

을 결코 일어날 수 있음을 나타냅니다? 이것은 결과에 대해 사용자가 신경을 쓰는지에 상관없이 future.get_result가 ndb 요청이 수행되는지 확인하기 위해 호출되어야한다는 의미입니까?

원래 문서 (https://developers.google.com/appengine/docs/python/ndb/async)는 말한다 :이 예에서

, 그것은 future.get_result 전화 좀 바보 다음 응용 프로그램이 NDB의 결과를 사용하지 않습니다. 그 코드는 바로 거기에있다. 요청 처리기가 NDB를 넣기 전에 종료하지 않도록한다. 이 끝났다; 요청 처리기가 너무 일찍 종료되면 put은 결코 일 수 없습니다. 편의상, 요청 핸들러를 @ ndb.toplevel로 꾸밀 수 있습니다. 이것은 비동기 요청이 끝날 때까지 종료하지 않도록 처리기에 알립니다. 이렇게하면 요청을 보낼 수 있으며 결과는 걱정하지 않아도됩니다.

답변

7

ndb 요청이 완료되기 전에 응용 프로그램 요청이 완료되면 ndb 요청이 여전히 끝날 수 있습니까? 제

이 평균을 하는가에 관계없이 단지 NDB의 요청이 수행되어 있는지 확인 어쨌든 호출 할 필요가 future.get_result 결과에 대한 사용자 관리 여부?

기본적으로 네,하지만 결과를 명시 적으로 기다릴 필요가 없도록 ndb.toplevel 데코레이터를 사용할 수 있습니다. 즉, 나는 이것이 당신이 원하는 것이라고 생각하지 않는다.

아마 taskqueue이 원하는 것입니다. 그것을 확인하시기 바랍니다.

+3

명확히하기 위해 NDB의 자동 일괄 처리 기능이 구현되지 않을 수있는 이유가 있습니다. put을 나타내는 Future가 자동 배터의 큐에있을 수 있으며, @ ndb.toplevel 데코레이터는 get_result()를 명시 적으로 호출하는 것 외에는 유일하게 확실한 방법이며 이러한 큐에있는 모든 put 요청이 섬기는 사람. –

1

설명해 주셔서 감사합니다. memcache.Client()의 incr_async()와 같은 일반적인 RPC (non-NDB)는 어떻습니까? 이것이 매우 빠른 RPC 호출이라는 것을 제외하고 RPC가 완료된다는 것을 보장합니까?

e.e.다음 중 어느 것이 사실이다 :

(A)가

(b)는 요청이 완료 요청을 완료하기 전에 알려진 모든 RPC를 기다릴 것입니다 인프라에 뭔가이고 비동기 RPC를 완료 할도 에 관계없이 요청이

(c)에 완료 될 때의 기내 RPC를 공식적으로 다른

(d)에 뭔가를

을 취소?

+1

의견을 수정하거나 질문을 수정하거나 새 질문을 게시하십시오. 답변 만 답변으로 게시해야합니다. –

+1

질문에 대한 대답은 (a)입니다. –

관련 문제