Como alocar tarefas pull

Quando as tarefas estão em uma fila pull, o worker pode alocá-las. Após o processamento das tarefas, ele precisa excluí-las.

Antes de começar

Lembretes importantes

  • Este método é aplicável apenas a workers que sejam executados em um serviço no ambiente padrão. Para usar um serviço de worker que não esteja no ambiente padrão para processar suas tarefas, consulte as referências API gRPC ou API REST do Cloud Tasks.
  • Ao usar filas pull, você é responsável por escalonar os workers com base no volume de processamento.

Como alocar tarefas

Depois que as tarefas estão na fila, um worker pode alocar uma ou mais delas usando o método lease_tasks(). Pode demorar um pouco para que as tarefas recém-adicionadas usando add() fiquem disponíveis por meio de lease_tasks().

Ao solicitar uma alocação, você especifica o número de tarefas a serem alocadas (máximo de 1.000) e a duração da alocação em segundos (no máximo uma semana). A duração da alocação deve ser longa o suficiente para garantir que a tarefa mais lenta tenha tempo de ser concluída antes do fim do período de alocação. Para modificar uma alocação de tarefas, use modify_task_lease().

A alocação de uma tarefa torna-a indisponível para processamento por outro worker até que ela expire.

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

O exemplo de código a seguir aloca 100 tarefas da fila pull-queue por uma hora:

from google.appengine.api import taskqueue

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

Processamento em lote com tags de tarefa

Nem todas as tarefas são iguais. Seu código pode incluir tags nas tarefas e depois escolher as que serão alocadas por tag. A tag 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.

Como regular taxas de pesquisa

Os workers que pesquisam a fila em busca de tarefas para alocar precisam detectar se estão tentando alocar tarefas mais rapidamente do que a fila pode fornecer. Se essa falha ocorrer, poderão ser geradas as seguintes exceções com base em lease_tasks():

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


O código precisa capturar essas exceções, desistir de chamar lease_tasks() e tentar novamente mais tarde. Para evitar esse problema, defina um prazo de RPC mais alto ao chamar lease_tasks() e não insista quando uma solicitação de alocação retornar uma lista vazia de tarefas.

Se você gerar mais de 10 solicitações de LeaseTasks por fila por segundo, apenas as 10 primeiras solicitações retornarão resultados. Se as solicitações ultrapassarem esse limite, OK será retornado sem nenhum resultado.

Como monitorar tarefas no Console do GCP

Para ver informações sobre todas as tarefas e filas no aplicativo:

  1. Abra a página Filas de tarefas no Console do GCP e selecione a guia Filas pull na barra de menus, localizada na parte superior da página.

    Acessar a guia Filas pull

  2. Clique no nome da fila em que você está interessado e abra a página de detalhes dela. Serão exibidas todas as tarefas na fila selecionada.

Como excluir tarefas

Depois que o worker conclui uma tarefa, ele precisa excluí-la da fila. Se continuarem sendo exibidas tarefas restantes em uma fila depois que o worker terminar de processá-las, é provável que tenha ocorrido falha no worker. Nesse caso, as tarefas serão processadas por outro worker.

Para excluir uma lista de tarefas, como aquela retornada por lease_task(), passe-a para 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 pull

Para um exemplo simples e completo do uso de filas pull no Python, consulte appengine-pullqueue-counter.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2