لا يتم إنشاء ملفات البيانات المنظَّمة على الفور. قد تستغرق عملية إنشاء ملفات 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))