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.
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. –