Status tugas polling

File Data Terstruktur tidak dibuat secara instan. Display & Video 360 mungkin memerlukan waktu beberapa detik hingga beberapa jam untuk membuat SDF Anda.

Untuk menentukan apakah tugas Anda telah selesai, ambil operasi secara rutin menggunakan sdfdownloadtasks.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 terisi, Display & Video 360 berhasil membuat SDF. Download file yang dihasilkan dari lokasi yang diberikan di response.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 download SDF menggunakan backoff eksponensial:

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