Status tugas polling

File Data Terstruktur yang diupload tidak langsung membuat atau memperbarui resource. Display & Video 360 mungkin memerlukan waktu mulai dari beberapa detik hingga beberapa jam untuk memproses SDF dan melakukan update yang dihasilkan. Beberapa file dapat diupload secara bersamaan selama tidak berisi resource yang tumpang-tindih.

Untuk menentukan apakah tugas Anda telah selesai, ambil operasi secara rutin menggunakan sdfuploadtasks.operations.get dan periksa apakah kolom done adalah True dan tugas telah selesai. Proses ini dikenal sebagai "polling".

Jika tugas selesai, kolom response atau error akan ditetapkan. Jika kolom error terisi, tugas gagal dan detail tentang kegagalan tersedia di objek Status yang dihasilkan. Jika kolom response diisi, SdfUploadTask akan ditetapkan ke kolom tersebut. Artinya, Display & Video 360 berhasil memproses SDF yang diupload. Download file hasil dari lokasi yang diberikan di kolom SdfUploadTask.resourceName.

Implementasi polling yang tidak efisien yang memeriksa laporan yang berjalan lama akan menggunakan banyak kuota permintaan API Anda. Untuk membatasi percobaan ulang dan menghemat kuota, gunakan backoff eksponensial.

Berikut cara melakukan polling operasi upload SDF menggunakan backoff eksponensial:

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