Questa pagina descrive come creare le attività e inserirle nelle code in modalità push. Quando vuoi elaborare un'attività, devi creare un nuovo oggetto attività e inserirlo in una coda. Puoi specificare in modo esplicito il servizio e il gestore che elaborano l'attività e, facoltativamente, trasmettere al gestore dati specifici dell'attività. Puoi anche ottimizzare la configurazione dell'attività, ad esempio pianificare un orario futuro in cui deve essere eseguita o limitare il numero di tentativi se l'attività non va a buon fine.
Creazione di una nuova attività
Per creare e mettere in coda un'attività, chiama la funzione taskqueue.add().
Il seguente codice crea un'attività che ha come target il servizio denominato worker
e richiama il relativo gestore impostando l'URL /update-counter
:
In alternativa, puoi creare un oggetto Task e chiamare il suo metodo add().
Specificare il servizio di worker
Quando un'attività viene rimossa dalla coda, il servizio Task Queue la invia a un servizio worker. Ogni attività ha un target e un URL, che determinano quale servizio e gestore eseguiranno l'attività.
target
La destinazione specifica il servizio che riceverà la richiesta HTTP per eseguire l'attività. È una stringa che specifica un servizio/versione/istanza in una qualsiasi delle forme canoniche. I moduli più utilizzati sono:
service
version.service
instance.version.service
La stringa di destinazione viene anteposta al nome di dominio della tua app. Esistono tre modi per impostare la destinazione di un'attività:
Dichiara il target quando crei l'attività. Puoi impostare la destinazione in modo esplicito utilizzando il parametro
target
nella funzione taskqueue.add(). Vedi l'esempio riportato sopra.Includi una direttiva
target
quando definisci una coda nelqueue.yaml
, come nella definizione diqueue-blue
. Tutte le attività aggiunte a una coda con untarget
utilizzeranno questa destinazione, anche se all'attività è stata assegnata una destinazione diversa al momento della creazione.Se non viene specificata alcuna destinazione in base a uno dei due metodi precedenti, la destinazione del task è la versione del servizio che lo mette in coda. Tieni presente che se metti in coda un'attività dal servizio e dalla versione predefiniti in questo modo e la versione predefinita cambia prima dell'esecuzione dell'attività, quest'ultima verrà eseguita nella nuova versione predefinita.
url
url
seleziona uno dei gestori nel servizio di destinazione, che eseguirà
l'attività.
url
deve corrispondere a uno dei pattern URL del gestore nel servizio di destinazione. url
può includere parametri di ricerca se il metodo specificato nell'attività è
GET
o PULL
. Se non viene specificato alcun url
, viene utilizzato l'URL predefinito
/_ah/queue/[QUEUE_NAME]
, dove [QUEUE_NAME]
è il nome
della coda del task.
Trasferimento dei dati al gestore
Puoi trasmettere i dati al gestore come parametri di ricerca nell'URL dell'attività, ma
solo se il metodo specificato nell'attività è GET
o PULL
.
payload
, che fornisce i dati delle attività nel corpo della richiesta HTTP.params
Queste tre chiamate sono equivalenti:
taskqueue.add(method=GET, url='/update-counter?key=blue', target='worker')
taskqueue.add(url='/update-counter', params={'key': 'blue'}, target='worker')
taskqueue.add(url='/update-counter', payload="{'key': 'blue'}", target='worker')
Assegnare un nome a un'attività
Quando crei una nuova attività, App Engine le assegna un nome univoco per impostazione predefinita. Tuttavia, puoi assegnare il tuo nome a un'attività utilizzando il parametro name
. Un vantaggio dell'assegnazione di nomi alle attività è che le attività con nome vengono
deduplicate, il che significa che puoi utilizzare i nomi delle attività per
garantire
che un'attività venga aggiunta una sola volta. La deduplicazione continua per 9 giorni dopo il
completamento o l'eliminazione dell'attività.
Tieni presente che la logica di deduplicazione introduce un overhead delle prestazioni significativo, con conseguente aumento delle latenze e potenzialmente dei tassi di errore associati alle attività denominate. Questi costi possono aumentare notevolmente se i nomi delle attività sono sequenziali, ad esempio con i timestamp. Pertanto, se assegni i tuoi nomi, ti consigliamo di utilizzare un prefisso ben distribuito per i nomi delle attività, ad esempio un hash dei contenuti.
Se assegni i tuoi nomi alle attività, tieni presente che la lunghezza massima del nome è di 500 caratteri e che il nome può contenere lettere maiuscole e minuscole, numeri, trattini bassi e trattini.
taskqueue.add(url='/url/path', name='first-try')
Aggiunta di attività in modo asincrono
Per impostazione predefinita, le chiamate che aggiungono attività alle code sono sincrone. Nella maggior parte degli scenari, le chiamate sincrone funzionano bene. L'aggiunta di un'attività a una coda è in genere un'operazione rapida. Una piccola percentuale di operazioni di aggiunta di attività può richiedere molto più tempo, ma il tempo mediano per aggiungere un'attività è inferiore a 5 ms.
Le operazioni di aggiunta di attività a code diverse non possono essere raggruppate in batch, pertanto l'API Task Queue fornisce anche chiamate asincrone che ti consentono di aggiungere queste attività in parallelo, riducendo ulteriormente questa latenza. Questa operazione è utile se stai creando un'applicazione estremamente sensibile alla latenza che deve eseguire contemporaneamente diverse operazioni di aggiunta di attività a code diverse.
Se vuoi effettuare chiamate asincrone a una coda di attività, utilizza i metodi asincroni
forniti dalla classe
Queue e da un oggetto
RPC. Chiama get_result()
sull'oggetto RPC
restituito per forzare il completamento della richiesta. Quando aggiungi in modo asincrono
attività in una transazione, devi chiamare get_result()
sull'oggetto RPC
prima di eseguire il commit della transazione per assicurarti che la richiesta sia stata completata
.
Accodamento delle attività nelle transazioni Cloud Datastore
Puoi mettere in coda un'attività nell'ambito di una transazione Datastore, in modo che l'attività venga messa in coda, e garantita per la messa in coda, solo se la transazione viene eseguita correttamente. Le attività aggiunte in una transazione sono considerate parte della transazione e hanno lo stesso livello di isolamento e coerenza.
Un'applicazione non può inserire più di cinque attività transazionali in code di attività durante una singola transazione. Le attività transazionali non devono avere nomi specificati dall'utente.
Il seguente esempio di codice mostra come inserire attività transazionali in una coda in modalità pushh nell'ambito di una transazione Datastore:
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
@ndb.transactional
def do_something_in_transaction():
taskqueue.add(url='/path/to/my/worker', transactional=True)
#...
do_something_in_transaction()
Utilizzo della libreria delle attività differite anziché di un servizio di gestione dei worker
La configurazione di un gestore per ogni attività distinta (come descritto nelle sezioni precedenti) può essere complessa, così come la serializzazione e la deserializzazione di argomenti complessi per l'attività, in particolare se hai molte attività diverse ma piccole che vuoi eseguire nella coda. L'SDK Python include una libreria
(google.appengine.ext.deferred
) che espone una semplice funzione che ti consente di
bypassare tutto il lavoro di configurazione di gestori di attività dedicati e di serializzazione e
deserializzazione dei parametri.
Per utilizzare questa libreria, devi aggiungere il componente aggiuntivo deferred
a app.yaml
. Per
maggiori informazioni, consulta la sezione
Gestori integrati del
riferimento app.yaml
.
Per utilizzare la libreria deferred
, è sufficiente passare la funzione e i relativi argomenti a
deferred.defer()
:
import logging
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Doing something expensive!")
# Do your work here
# Somewhere else
deferred.defer(do_something_expensive, "Hello, world!", 42, True)
La libreria deferred
raggruppa la chiamata di funzione e i relativi argomenti, quindi li aggiunge
alla coda di attività. Quando l'attività viene eseguita, la libreria deferred
esegue
do_something_expensive("Hello, world!", 42, True)
.
Utilizzare le attività in un'applicazione multi-tenant
Per impostazione predefinita, le code push utilizzano lo spazio dei nomi corrente impostato nel gestore dello spazio dei nomi al momento della creazione dell'attività. Se la tua applicazione utilizza il multitenancy, consulta l'API Namespaces Python 2.
Passaggi successivi
- Scopri come creare gestori di attività.