2012-07-23 6 views
7

Sto usando ndb per scrivere un modello di profiling che registra alcuni dati per richiesta di applicazione. Ogni richiesta chiama una richiesta ndb da ndb.put_async per registrare i dati, mentre al client non interessa il risultato. In sostanza, non voglio che la richiesta dell'applicazione attenda il salvataggio dei dati statistici per la profilazione.È garantito che ndb async venga eseguito al termine della richiesta dell'applicazione?

Tuttavia, ero confuso circa la spiegazione dalla documentazione ufficiale. Se una richiesta di applicazione è terminata prima che la richiesta ndb termini, la richiesta ndb dovrebbe ancora essere completata? La documentazione indica che

se il gestore di richieste esiste troppo presto, il put potrebbe mai accadere

A quali criteri sarebbe succedere? Questo significa che indipendentemente dal fatto che un utente si preoccupi del risultato, è necessario chiamare comunque future.get_result solo per assicurarsi che venga eseguita la richiesta ndb?

La documentazione originale (https://developers.google.com/appengine/docs/python/ndb/async) dice:

In questo esempio, è un po 'sciocco per chiamare future.get_result: l'applicazione non usa mai il risultato da NDB. Quel codice è solo lì per assicurarsi che il gestore della richiesta non esca prima che l'NDB inserisca le finiture ; se il gestore richieste esce troppo presto, la put non può mai accadere . Per comodità, puoi decorare il gestore richieste con @ ndb.toplevel. Ciò indica al gestore di non uscire fino al completamento delle sue richieste asincrone . Questo a sua volta ti consente di inviare la richiesta e non preoccuparti del risultato.

risposta

7

Se una richiesta di applicazione ha terminato prima della richiesta NDB finiture, sarebbe la richiesta ndb ancora essere garantito a finire?

No.

Questo significa che, indipendentemente dal fatto che un utente cura per il risultato, future.get_result deve essere chiamato in ogni caso solo per assicurarsi che viene eseguita la richiesta ndb?

Fondamentalmente sì, ma è possibile utilizzare ndb.toplevel decorator per la comodità in modo da non dover attendere esplicitamente il risultato. Detto questo, non penso che questo sia quello che vuoi.

Probabilmente taskqueue è ciò che desideri. Per favore controlla.

+3

Per chiarire, il motivo per cui la put potrebbe non accadere è la funzione di auto-dosaggio di NDB. Il futuro che rappresenta il put potrebbe trovarsi nella coda del batch automatico e il decoratore @ ndb.toplevel è l'unico modo sicuro (a parte chiamare esplicitamente get_result()) per assicurarsi che tutte le richieste di inserimento in tali code vengano inviate al server. –

1

Grazie per il chiarimento. Che dire di un RPC generale (non NDB) - ad es., Incr_async() in memcache.Client()? Mettendo da parte che questa è una chiamata RPC molto, molto veloce, è garantito che il RPC sarà completato?

I.e., Quale delle seguenti condizioni:

(a) c'è qualcosa nelle infrastrutture che attende su tutte le RPC noti prima di completare la richiesta

(b) la richiesta completerà e le RPC asincrone sarà anche complete indipendentemente da quando la richiesta viene completata

(c) l'in-flight RPC sono formalmente annullati

(d) qualcosa d'altro?

+1

Si prega di pubblicare aggiornamenti come questo come commenti, modifiche alla tua domanda, o una nuova domanda - solo le risposte dovrebbero essere pubblicate come risposte. –

+1

La risposta alla tua domanda, tuttavia, è (a). –

Problemi correlati