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

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