Leasing Pull Tasks

Assim que as tarefas estiverem numa fila de obtenção, um trabalhador pode alugá-las. Depois de processadas, o trabalhador tem de eliminar as tarefas.

Antes de começar

Contexto importante

  • Este método só é aplicável a trabalhadores que estão a ser executados num serviço no ambiente padrão.
  • Quando usa filas de obtenção, é responsável por dimensionar os seus trabalhadores com base no volume de processamento.

Tarefas de leasing

Depois de as tarefas estarem na fila, um trabalhador pode alugá-las através do método lease_tasks(). Pode haver um pequeno atraso antes de as tarefas adicionadas recentemente através do add() ficarem disponíveis através do lease_tasks().

Quando pede uma concessão, especifica o número de tarefas a conceder (até um máximo de 1000 tarefas) e a duração da concessão em segundos (até um máximo de uma semana). A duração da concessão tem de ser suficientemente longa para garantir que a tarefa mais lenta tem tempo para terminar antes de o período de concessão expirar. Pode modificar uma concessão de tarefa através de modify_task_lease().

O aluguer de uma tarefa torna-a indisponível para processamento por outro trabalhador e permanece indisponível até o aluguer expirar.

O método lease_tasks() devolve um objeto Task que contém uma lista de tarefas alugadas da fila.

O exemplo de código seguinte aluga 100 tarefas da fila pull-queue durante uma hora:

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
q.lease_tasks(3600, 100)

Processamento em lote com etiquetas de tarefas

Nem todas as tarefas são iguais. O seu código pode "etiquetar" tarefas e, em seguida, escolher tarefas para alugar por etiqueta. A etiqueta funciona como um filtro.

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
q.add(taskqueue.Task(payload='parse1', method='PULL', tag='parse'))
q.add(taskqueue.Task(payload='parse2', method='PULL', tag='parse'))
q.add(taskqueue.Task(payload='render1', method='PULL', tag='render'))
q.add(taskqueue.Task(payload='render2', method='PULL', tag='render'))

q.lease_tasks_by_tag(3600, 100, 'render') # leases render tasks, but not parse

q.lease_tasks_by_tag(3600, 100) # Leases up to 100 tasks that have same tag.

Regulamentar as taxas de sondagem

Os trabalhadores que sondam a fila para alugar tarefas devem detetar se estão a tentar alugar tarefas mais rapidamente do que a fila as pode fornecer. Se esta falha ocorrer, podem ser geradas as seguintes exceções de lease_tasks():

  • google.appengine.api.taskqueue.TransientError
  • google.appengine.runtime.apiproxy_errors.DeadlineExceededError


O seu código tem de detetar estas exceções, deixar de chamar lease_tasks() e, em seguida, tentar novamente mais tarde. Para evitar este problema, considere definir um prazo mais elevado para o RPC ao chamar lease_tasks(). Também deve recuar quando um pedido de aluguer devolve uma lista de tarefas vazia.

Se gerar mais de 10 pedidos LeaseTasks por fila por segundo, apenas os primeiros 10 pedidos devolvem resultados. Se os pedidos excederem este limite, é devolvido OK com zero resultados.

Monitorizar tarefas na Google Cloud consola

Para ver informações sobre todas as tarefas e filas na sua aplicação:

  1. Abra a página Cloud Tasks na Google Cloud consola e procure o valor Pull na coluna Tipo.

    Aceda ao Cloud Tasks

  2. Clique no nome da fila na qual tem interesse para abrir a página de detalhes da fila. Apresenta todas as tarefas na fila selecionada.

Eliminar tarefas

Assim que um trabalhador conclui uma tarefa, tem de a eliminar da fila. Se vir tarefas restantes numa fila depois de um trabalhador terminar o processamento das mesmas, é provável que o trabalhador tenha falhado. Neste caso, as tarefas são processadas por outro trabalhador.

Pode eliminar uma lista de tarefas, como a devolvida por lease_task(), simplesmente transmitindo-a a delete_tasks():

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
tasks = q.lease_tasks(3600, 100)
# Perform some work with the tasks here
q.delete_tasks(tasks)

Um exemplo completo de filas de obtenção

Para um exemplo simples, mas completo, de utilização de filas de obtenção no Python, consulte o artigo appengine-pullqueue-counter.