Status da tarefa de pesquisa

Os arquivos de dados estruturados não são gerados instantaneamente. O processo de geração dos seus arquivos SDF pode levar de alguns segundos a algumas horas, dependendo da plataforma Display & Video 360.

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

Se a tarefa estiver concluída, ou oresponse ouerror O campo está definido. Se oerror O campo foi preenchido, a tarefa falhou e os detalhes sobre a falha estão disponíveis no resultado.Status objeto. Se oresponse O campo foi preenchido e o Display & Video 360 gerou os arquivos SDF com sucesso. Baixe os arquivos resultantes do local fornecido em response.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 download de SDF usando a espera exponencial:

# Provide the name of the sdfdownloadtask 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 sdfdownloadtasks.operations.get request.
get_request = service.sdfdownloadtasks().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 resulting files can be '
        f'downloaded at {operation["response"]["resourceName"]}.')
    break
  elif time.time() - start_time > max_retry_elapsed_time:
    print("SDF generation 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))