สถานะงานแบบสำรวจ

ระบบจะไม่สร้างไฟล์ Structured Data ทันที Display & Video 360 อาจใช้เวลาตั้งแต่ไม่กี่วินาทีจนถึงหลายชั่วโมงในการสร้าง SDF

หากต้องการดูว่างานเสร็จสมบูรณ์แล้วหรือไม่ ให้ดึงข้อมูลการดำเนินการเป็นประจำโดยใช้ sdfdownloadtasks.operations.get และตรวจสอบว่าฟิลด์ doneเป็น True และงานเสร็จสมบูรณ์แล้ว กระบวนการนี้เรียกว่า "การสำรวจ"

หากงานเสร็จแล้ว ระบบจะตั้งค่าฟิลด์ response หรือ error หากมีการป้อนข้อมูลในฟิลด์ error แสดงว่า งานล้มเหลวและรายละเอียดเกี่ยวกับความล้มเหลวจะอยู่ในออบเจ็กต์ Status ที่ได้ หากมีการป้อนข้อมูลในช่อง response แสดงว่า Display & Video 360 สร้าง SDF ได้สำเร็จ ดาวน์โหลดไฟล์ที่ได้ จากตำแหน่งที่ระบุใน response.resourceName

การติดตั้งใช้งานการสำรวจที่ไม่มีประสิทธิภาพซึ่งตรวจสอบรายงานที่ใช้เวลานานจะใช้โควต้าคำขอ API ของคุณเป็นจำนวนมาก หากต้องการจำกัดการลองใหม่และ ประหยัดโควต้า ให้ใช้ Exponential Backoff

วิธีสำรวจการดำเนินการดาวน์โหลด SDF โดยใช้ Exponential Backoff มีดังนี้

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