حالة مهمة الاستطلاع

لا تؤدي ملفات البيانات المنظَّمة التي تم تحميلها إلى إنشاء مراجع أو تعديلها بشكل فوري. قد تستغرق "مساحة العرض والفيديو 360" بضع ثوانٍ إلى عدة ساعات لمعالجة ملفات SDF وإجراء التعديلات الناتجة. يمكن تحميل ملفات متعددة في الوقت نفسه طالما أنّها لا تحتوي على أي موارد متداخلة.

لتحديد ما إذا كانت مهمتك قد انتهت، استردِد العملية بانتظام باستخدام sdfuploadtasks.operations.get وتحقّق مما إذا كان الحقل done هو True وما إذا كانت المهمة قد انتهت. تُعرف هذه العملية باسم "الاستقصاء".

إذا تم الانتهاء من المهمة، يتم ضبط الحقل response أو error. إذا تم ملء الحقل error، يعني ذلك أنّ المهمة تعذّر تنفيذها، ويمكن الاطّلاع على تفاصيل حول هذا التعذّر في العنصر الناتج Status. إذا تمّت تعبئة الحقل response، سيتمّ تعيين SdfUploadTask للحقل. وهذا يعني أنّ "مساحة العرض والفيديو 360" عالجت ملف SDF الذي تم تحميله بنجاح. نزِّل ملفات النتائج من الموقع الجغرافي المقدَّم في الحقل SdfUploadTask.resourceName.

يؤدي تنفيذ عملية استقصاء غير فعّالة تتحقّق من تقرير يستغرق وقتًا طويلاً إلى استهلاك جزء كبير من حصة طلبات واجهة برمجة التطبيقات. للحدّ من عمليات إعادة المحاولة والحفاظ على الحصة، استخدِم خوارزمية الرقود الأسي الثنائي.

في ما يلي كيفية إجراء استطلاع لعملية تحميل ملف SDF باستخدام خوارزمية الرقود الأسي الثنائي:

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