העלאת קבצים של נתונים מובְנים לא יוצרת או מעדכנת משאבים באופן מיידי. עיבוד קובצי ה-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))