העלאה של קבצים עם נתונים מובְנים לא יוצרת או מעדכנת משאבים באופן מיידי. יכולות לחלוף כמה שניות או כמה שעות עד שמערכת Display & Video 360 תעבד את קובצי ה-SDF ותבצע את העדכונים שנובעים מהם. אפשר להעלות כמה קבצים בו-זמנית, כל עוד הם לא מכילים משאבים חופפים.
כדי לדעת אם המשימה הסתיימה, צריך לאחזר את הפעולה באופן קבוע באמצעות sdfuploadtasks.operations.get ולבדוק אם השדה done הוא True והמשימה הסתיימה. התהליך הזה נקרא 'תשאול'.
אם המשימה הסתיימה, השדה response או error מוגדר. אם השדה error מלא, המשימה נכשלה ופרטים על הכשל זמינים באובייקט Status שמתקבל. אם השדה response מאוכלס, יוקצה ערך SdfUploadTask לשדה. המשמעות היא שמערכת Display & Video 360 עיבדה בהצלחה את קובץ ה-SDF שהועלה. מורידים את קובצי התוצאות מהמיקום שצוין בשדה SdfUploadTask.resourceName.
הטמעה לא יעילה של סקר שבודק דוח שפועל במשך זמן רב צורכת חלק גדול ממכסת הבקשות ל-API. כדי להגביל את מספר הניסיונות החוזרים ולחסוך במכסה, צריך להשתמש בהשהיה מעריכית לפני ניסיון חוזר.
כך מבצעים בדיקה חוזרת של פעולת העלאה של 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))