État de la tâche d'interrogation

Les fichiers de données structurées importés ne créent ni ne mettent à jour les ressources instantanément. Le traitement de vos fichiers SDF et l'application des modifications qui en résultent peuvent prendre de quelques secondes à plusieurs heures dans Display & Video 360. Vous pouvez importer plusieurs fichiers simultanément, à condition qu'ils ne contiennent pas de ressources qui se chevauchent.

Pour déterminer si votre tâche est terminée, récupérez régulièrement l'opération à l'aide de sdfuploadtasks.operations.get et vérifiez si le champ done est défini sur True et si la tâche est terminée. Ce processus est appelé "interrogation".

Si la tâche est terminée, le champ response ou error est défini. Si le champ error est renseigné, la tâche a échoué. Des informations sur l'échec sont disponibles dans l'objet Status résultant. Si le champ response est renseigné, un SdfUploadTask sera attribué au champ. Cela signifie que Display & Video 360 a bien traité le fichier SDF importé. Téléchargez les fichiers de résultats à partir de l'emplacement indiqué dans le champ SdfUploadTask.resourceName.

Une implémentation d'interrogation inefficace qui vérifie un rapport de longue durée consomme une grande partie de votre quota de requêtes d'API. Pour limiter les nouvelles tentatives et préserver le quota, utilisez un intervalle exponentiel entre les tentatives.

Voici comment interroger une opération d'importation de fichier de données structurées à l'aide d'un intervalle exponentiel entre les tentatives :

# 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))