لا يتم إنشاء ملفات البيانات المنظَّمة بشكل فوري. قد يستغرق إنشاء ملفات SDF في "مساحة العرض والفيديو 360" مدّة تتراوح بين بضع ثوانٍ وساعات.
لتحديد ما إذا كانت مهمتك قد اكتملت، استرجع العملية بانتظام باستخدام
sdfdownloadtasks.operations.get
وتحقّق مما إذا كان الحقل
done
هو True
وكانت المهمة قد اكتملت. تُعرف هذه العملية باسم "الاستطلاع".
إذا تم الانتهاء من المهمة، يتم ضبط الحقل response
أو
error
. في حال تعبئة حقل error
، تعذّر إكمال مهمة
وتكون تفاصيل عن سبب التعذّر متاحة في عنصر
Status
الناتج. في حال تمّت تعبئة الحقل response
،
تعني هذه الحالة أنّ "مساحة العرض والفيديو 360" أنشأت ملفات SDF بنجاح. نزِّل الملفات الناتجة
من الموقع المحدد في response.resourceName
.
إنّ تنفيذ عمليات الاستطلاع غير الفعّالة التي تتحقّق من تقرير يستغرق وقتًا طويلاً يستهلك الكثير من حصة طلبات البيانات من واجهة برمجة التطبيقات. للحدّ من عمليات إعادة المحاولة والحفاظ على الحصة، استخدِم خوارزمية الرقود الأسي.
في ما يلي كيفية إجراء استطلاع لتشغيل تنزيل SDF باستخدام خوارزمية الرقود الأسي الثنائي:
# 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))