Status da tarefa de pesquisa

Os arquivos de dados estruturados enviados não criam nem atualizam recursos instantaneamente. O Display & Video 360 pode levar de alguns segundos a horas para processar seus SDFs e fazer as atualizações resultantes. É possível fazer upload de vários arquivos ao mesmo tempo, desde que eles não contenham recursos sobrepostos.

Para determinar se a tarefa foi concluída, recupere regularmente a operação usando sdfuploadtasks.operations.get e verifique se o campo done é True e se a tarefa foi concluída. Esse processo é conhecido como "sondagem".

Se a tarefa for concluída, o campo response ou error será definido. Se o campo error estiver preenchido, a tarefa falhou e os detalhes sobre a falha estarão disponíveis no objeto Status resultante. Se o campo response estiver preenchido, um SdfUploadTask será atribuído a ele. Isso significa que o Display & Video 360 processou o SDF enviado com sucesso. Faça o download dos arquivos de resultado no local fornecido no campo SdfUploadTask.resourceName.

Uma implementação de pesquisa ineficiente que verifica um relatório de longa duração consome muito da sua cota de solicitações de API. Para limitar as tentativas e economizar cota, use a espera exponencial.

Veja como consultar uma operação de upload de SDF usando a espera exponencial:

# Import the necessary libraries
import random
import time

# Provide the name of the sdfuploadtask operation.
operation_name = operation-name

# Set the following values that control retry behavior while the operation
# is running.
# Minimum amount of time between polling requests. Defaults to 5 seconds.
min_retry_interval = 5
# Maximum amount of time between polling requests. Defaults to 5 minutes.
max_retry_interval = 5 * 60
# Maximum amount of time to spend polling. Defaults to 5 hours.
max_retry_elapsed_time = 5 * 60 * 60

# Configure the sdfuploadtasks.operations.get request.
get_request = service.sdfuploadtasks().operations().get(operation_name)

sleep = 0

start_time = time.time()
while True:
  # Get current status of the report.
  operation = get_request.execute()

  if "done" in operation:
    if "error" in operation:
      print(
        f'The operation finished in error with code '
        f'{operation["error"]["code"]}: {operation["error"]["message"]}')
    else:
      print(
        f'The operation completed successfully. The result files can be '
        f'downloaded at {operation["response"]["resourceName"]}.')
    break
  elif time.time() - start_time > max_retry_elapsed_time:
    print("Polling deadline exceeded.")
    break

  sleep = next_sleep_interval(sleep)
  print(
    f'Operation {operation_name} is still running, sleeping for '
    f'{sleep} seconds.')
  time.sleep(sleep)

def next_sleep_interval(previous_sleep_interval):
  """Calculates the next sleep interval based on the previous."""
  min_interval = previous_sleep_interval or min_retry_interval
  max_interval = previous_sleep_interval * 3 or min_retry_interval
  return min(max_retry_interval, random.randint(min_interval, max_interval))