סטטוס המשימה של הסקר

העלאת קבצים של נתונים מובְנים לא יוצרת או מעדכנת משאבים באופן מיידי. עיבוד קובצי ה-SDF והעדכונים הנובעים מהם ב-Display & Video 360 עשוי להימשך בין כמה שניות למספר שעות. אפשר להעלות קבצים בו-זמנית, כל עוד הם לא מכילים משאבים חופפים.

כדי לבדוק אם המשימה הסתיימה, צריך לאחזר את הפעולה באופן קבוע באמצעות sdfuploadtasks.operations.get ולבדוק אם השדה done הוא True והמשימה הסתיימה. התהליך הזה נקרא 'סקרים'.

אם המשימה הסתיימה, השדה response או השדה error מוגדר. אם השדה error מאוכלס, המשימה נכשלה ופרטים על הכישלון זמינים באובייקט Status שנוצר. אם השדה response מאוכלס, יוקצה לו הערך SdfUploadTask. המשמעות היא שמערכת Display & Video 360 עיבדה בהצלחה את קובץ ה-SDF שהעליתם. מורידים את קובצי התוצאה מהמיקום שצוין בשדה SdfUploadTask.resourceName.

הטמעה לא יעילה של סקרים שבה בודקים דוח ארוך צורכת הרבה ממכסת הבקשות ל-API. כדי להגביל את מספר הניסיונות החוזרים ולשמור על המכסה, מומלץ להשתמש בהשהיה מעריכית לפני ניסיון חוזר (exponential backoff).

כך בודקים את סטטוס פעולת ההעלאה של SDF באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff):

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